django 테스트를 pytest로 실행시키기

버전 1.7부터 django에서 기본으로 제공하는 테스트 러너가 마이그레이션 과정을 거치기 시작했다. 당연히 테스트 과정에 드는 시간은 늘어났고. 1.8에서는 --keepdb라는 옵션을 제공하여 마이그레이션을 회피할 수 있는 듯 하다. 1.7에서도 작동하는 우회법(1, 2)들도 존재한다.

하지만 이참에 pytest를 사용해보기로 했다.

장점

  • DB 파일을 매번 새로 만들지 않는다. (=테스트 실행 속도 향상)
  • 테스트 간 의존성을 관리할 수 있다.
  • 테스트 동시 실행도 가능한다. (pytest-xdist 필요)
  • 기존 테스트들과 호환된다.

설치

$ pip install pytest-django

이렇게 하면 pytest 뿐만 아니라 django의 테스트 코드를 인식하는 플러그인도 설치된다.

설정

테스트를 실행할 디렉터리에 (보통은 manage.py 파일이 위치하는 디렉터리) pytest.ini 파일을 생성하고, 테스트에 사용하는 설정 파일을 지정해준다. (아래는 설정 파일이 ./settings/test.py인 경우)

[pytest]
DJANGO_SETTINGS_MODULE=settings.test  

사용

$ py.test

=========================== test session starts ============================
platform darwin -- Python 2.7.8 -- py-1.4.26 -- pytest-2.6.4  
plugins: django  

현재 플랫폼에 설치된 파이썬과 pytest의 버전이 출력된 다음 django 테스트들이 실행된다. 하지만 마이그레이션이 먼저 실행되면서 시간을 잡아먹거나 오류를 발생시킨다. 이럴 땐, --nomigrations 옵션을 붙이면 마이그레이션 과정을 건너 뛴다.

$ py.test --nomigrations

병렬 실행

pytest-xdist 플러그인을 설치하면 테스트들을 병렬적으로 실행할 수도 있다.

$ pip install pytest-xdist
$ py.test -n 3  # 테스트가 3개씩 병렬적으로 실행됨

Continuous Test

소스코드가 바뀌었을 때 자동으로 테스트를 실행할 수는 없을까? pytest-xdixt 플러그인이 설치된 상태에서 -f 옵션을 사용하면 가능하다. 똑똑하게도 바뀐 소스에 대한 테스트만 먼저 실행하고, 이를 통과하면 전체 테스트를 수행한다.

$ py.test -f   # 소스코드가 바뀌면 자동으로 테스트가 실행된다 

디버거와 함께

테스트 실행 도중 특정 위치에서 디버거를 켜고 싶을 수도 있다. --pdb 옵션을 사용하자.

--pdb-f 옵션은 함께 사용할 수 없다.

$ py.test --pdb

그리고 테스트 코드 중간에 다음과 같은 코드를 삽입한다.

import pytest  
pytest.set_trace()  

테스트가 실행되다가 해당 부분에서 멈추고 디버거를 보여준다.

이 외에도 유용한 기능들은 pytest 사용법(영문) 페이지를 참고하자.