PROJECTS

pytest 에러

nicesugi 2022. 12. 7. 23:40

테스트코드를 작성하여

로직에 대한 에러처리와 코드가 잘 작동되는지 검증하고 확인할 수 있다는 사실을 알게되어,

장고에 내장되어있는 django.test 모듈을 사용하여

한 앱의 APIs와 Services 에 대한 테스트코드를 작성했었다.

 

from django.test import TestCase 코드

최근 구인 과정 중 기업과제를 몇번 접해보니 unittest 보다는 pytest를 많이 사용하는 것 같더라.

 

pytest는

fixture를 별도의 함수로 분리해서 관리

필요한 테스트 케이스에서만 호출해서 사용

fixture를 모듈화, 재가공, 재사용 등이 쉬움

테스트코드 결과도 unittest 보다 좀 더 상세함

 

장점들이 많아보여 사용해보고자 ! 모듈을 임포트하여 세팅하는 과정에 ... 겪은 문제들에 대해 적어본다. 🥲

 


1. pytest 실행시

 E django.core.exceptions.ImproperlyConfigured: Requested settings, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings. 

1번 에러

✨ 1번 해결  

에러메세지에서 모듈 세팅이 안됐다하여

root directory에 pytest.ini 파일을 생성하여   DJANGO_SETTINGS_MODULE  을 설정해주니 해결 !

# pytest.ini

[pytest]
DJANGO_SETTINGS_MODULE = 프로젝트명.settings

 


 

2.  시크릿키를 읽지못함

 django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

아래의 코드처럼 환경변수에 시크릿키를 넣어 관리했었는데, pytest 실행시 시크릿키를 읽지 못하더라.

# .env
SECRET_KEY="시크릿키"

# settings.py
SECRET_KEY = os.environ.get("SECRET_KEY")

2번 에러

✨ 2번 해결

root directory에 secrets.json 파일 생성 후 settings 에서 시크릿키를 불러오는 함수를 재작성하여 해결 !

( .gitignore에 secrets.json 꼭꼭 추가하여 관리해주자 )

# secrets.json
{
    "SECRET_KEY":"시크릿키"
}

# settings.py
import json

secret_file = os.path.join(BASE_DIR, "secrets.json")

with open(secret_file) as f:
    secrets = json.loads(f.read())


def get_secret(setting, secrets=secrets):
    try:
        return secrets[setting]
    except KeyError:
        error_msg = "Set the {} environment variable".format(setting)
        raise ImproperlyConfigured(error_msg)


SECRET_KEY = get_secret("SECRET_KEY")

 


 

3. tests.py 안에 하나의 테스트코드(test_true())가 있으나 읽지 못함

결과값은 no tests 라고 하며 collected 0 items이 뜸

3번 에러

✨ 3번 해결 ✨

pytest.ini 파일에 python_files 부분에 테스트하는 파일명을 지정해주니 test_true() 함수를 인식함

# pytest.ini
[pytest] 
python_files = tests.py test_*.py *_tests.py # 추가해주기

 


이렇게 해결은 되었으나 

SECRET_KEY 는 json 파일이 아닌 환경변수로 계속 관리하고싶다는 생각을 하다보니 read_env를 사용해서 불러올 수 있을 것 같다.

그리고 프로젝트 내의 테스트코드의 형식은 통일하는 것이 나을 것 같다는 생각이 들어 pytest는 다른 프로젝트에 적용해보고자 한다.

다시 바꿔야지..

반응형