Django 프로젝트에서 unittest을 작성하고 pytest로 실행시키면 환경 설정이 안 돼 있다는 에러 메세지가 뜬다. Django에서 pytest를 이용하기 위한 pytest-django 모듈이 따로 존재한다. Getting started with pytest and pytest-django을 번역하고 적용해보았다.


예시로 사용될 Django project

예시로 사용될 Djangoe project의 구조이다. lists라는 앱을 생성했고, 앱을 생성할 때 자동으로 생성되는 lists/tests.py 파일에 간단한 테스트를 작성했다.

$ tree superlists/
superlists/
├── lists
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── superlists
   ├── __init__.py
   ├── settings.py
   ├── urls.py
   └── wsgi.py


서론

pytestpytest-django는 표준 장고 테스트 및 Nose 테스트와 호환된다. 이들은 간단하거나 거의 없는 환경설정으로 존재하는 테스트를 찾아서 실행할 수 있다. 빠르게 시작하는 방법에 대해 이 글에서 설명한다.


설치

pytest-django 는 pip을 통해 설치할 수 있다.

$ pip install pytest-django

pytest-django를 설치하면 자동적으로 최신버전의 pytest도 같이 설치된다. pytest-djangopytest의 플러그인 시스템을 사용하고 특별한 설정 없이 설치 후에 바로 사용 가능하다.


설치한 후에 pytest을 실행해보면 lists/tests.py 를 발견하지 못한다.
pytest lists/test.py 명령으로 app의 테스트를 명시적으로 실행시켜보면 에러가 발생한다.

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.

이후에 나오는 설정을 적용해야 정상적으로 동작한다.


Django 설정에 pytest 지정하기

pytest에게 테스트를 실행하기 위한 Django 설정을 알려줄 필요가 있다. 가장 쉬운 방법은 이런 정보를 가진 pytest 환경설정 파일을 만드는 것이다.

프로젝트 root directory에 pytest.ini 라는 파일을 생성하고 아래의 내용을 작성한다.

[pytest]
DJANGO_SETTINGS_MODULE = yourproject.settings

DJANGO_SETTINGS_MODULE 환경 변수를 설정하거나 커맨드 라인에서 테스트를 실행할 때 --ds=yourproject.settings옵션을 명시하는 것과 같이 Django setting을 할 수도 있다.
여기에 대한 전체적인 내용은 Configuring Django settings을 참고하면 된다.

또한 선택사항으로, [pytest] 섹션에 아래의 내용을 입력하면 pytest가 장고의 기본 app 레이아웃에 따라 test를 찾아낼 수 있다. 더 자세한 정보는 My tests are not being found. Why?를 참고하자.

python_files = tests.py test_*.py *_tests.py


위의 내용을 바탕으로 pytest.ini 파일을 superlists/ 에 생성하고 아래의 내용을 넣었다.

$ tree superlists/ -L 1
superlists/
├── lists
├── manage.py
├── superlists
└── pytest.ini

pytest.ini

[pytest]
DJANGO_SETTINGS_MODULE = superlists.settings
python_files = tests.py test_*.py *_tests.py


테스트 실행

테스트를 실행하는 방법은 manage.py test을 사용하는 대신에 아래의 간단한 명령으로 가능하다.

$ pytest

pytest가 파일을 찾이 못하는 문제가 발생하면 I see an error saying “could not import myproject.settings”을 참고하자.


$ pytest lists/tests.py으로도 테스트 실행이 가능하지만, pytest 뒤에 lists/tests.py 테스트 파일을 지정하지 않아도 $ pytest 명령 하나로 lists앱의 테스트파일을 알아서 찾아서 실행시켜준다ㅔ.


추가자료

Github commit의 사용자 정보가 이름만 보여지는 현상

iMac을 몇 개월 정도 사용할 기회가 생겨서 Git을 새로 설치했다. 기존의 작업하던 내용을 Github에서 clone 받아서 작업한 후 push 했더니 commit의 사용자 정보가 이상하게 나오는 현상이 발생했다. Git을 새로 설치하면 ...… Continue reading