최근 진행한 프로젝트에서 FastAPI를 사용했는데 Python 으로 개발도 처음이거니와 FastAPI, Pytest 등 모든게 처음이라서 삽질을 꽤나 했다. 내가 찾지 못한걸수도 있는데 관련된 정보도 잘 안나와서 정리를 했다. test를 하면서 문제가 된건 한 대표적으로 3가지 정도 있었다.
UnitTest의 FIRST 원칙 에 의하면 유닛 테스트에서 각 테스트는 독립적이어야 하며 따라서 다른 테스트에 영향을 주지 않고 순서가 상관없어야 한다. 하지만 FastAPI와 SQAlchemy 공식 문서를 따라 테스트를 하면 독립성이 지켜지지 않는다. 기존에 SpringBoot 프레임워크를 통해 테스트코드를 작성할때는 @Test 어노테이션과 @Transactional 어노테이션만 붙이면 알아서 Rollback이 돼서 한번도 테스트 코드의 데이터가 db에 저장되거나 다른 테스트 코드에 영향을 줄수있다는건 걱정을 안했다. 하지만 PyTest에서는 이런 편리한 rollback 을 지원하는 어노테이션 따위는 없었고 직접 모든 테스트마다 롤백을 하거나 테스트용 db를 따로 만드는 등의 작업이 필요했다.
FastAPI로 개발을 하면서 비밀번호나 Secret-key 같은 정보들은 python-dotenv 를 설치하고 .env 파일에 저장했는데 테스트코드 실행 시 이 env파일을 테스트 환경에서 인식을 못했다. 알고보니 Pytest의 core가 .env 파일을 지원하지 않는다고 한다.
그래서 pytest-dotenv 패키지를 설치해서 사용하거나, 사용할 환경변수 파일을 pytest 실행 시에 옵션으로 직접 입력함으로서 해결했다.
이건 진짜진짜진짜 이상한 문제였는데 검색해봐도 잘 나오지 않았다. 위의 문제를 pytest-dotenv 패키지를 통해 해결했는데 테스트에서 사용할 env 파일을 pytest.ini 파일에 작성을 해야 한다. 해당 파일에 env 파일 리스트를 작성했는데 파일 순서에 따라 인식이 되고 안되고 그랬다
[pytest]
env_override_existing_values = 1
filterwarnings =
ignore::DeprecationWarning
ignore::UserWarning
env_files =
tests/.test.env
.env
처음에 이렇게 작성했는데 여전히 env 파일을 인식하지 못하는 오류가 있었다. 오류를 한참 찾다가 다시 파일을 작성하면서 순서를 이렇게 바꿨는데
[pytest]
env_override_existing_values = 1
filterwarnings =
ignore::DeprecationWarning
ignore::UserWarning
env_files =
.env
tests/.test.env
바로 인식이 돼더라. 순서만 바뀐건데 에러가 해결됐다;;
이 부분은 좀 더 수정을 해보면서 뭐가 문제였는지 알아봐야겠다. 앞의 문제들을 해결한답시고 패키지들을 이것저것 설치하면서 꼬여서 뭐가 원인이었는지 잘 모르게 됐지만 순서를 바꾸면 또 환경변수 파일을 인식못했다.