백그라운드
요즘 Ruby on Rails + Rspec 조합으로 살다가, Django + PyTest으로 머리를 포팅하고 있다.
마이그레이트를 사용하지 않는 장고 프로젝트에서 PyTest를 사용하는 방법을 삽질하면서 찾아봤는데
이걸 정리해보고자 한다.
방법 (두가지 방법 다 설정해줘야 한다. )
1. pytest.ini에 설정값 추가해주기
[pytest]
addopts = --reuse-db --nomigration
reuse-db는 데이터를 재사용한다는 옵션이다. pytest는 돌릴때마다 자동으로 database를 생성하고, 삭제해준다.
reuse-db를 쓰면 한번 만든 데이터베이스를 테스트코드가 끝나고 나서도 삭제하지 않는다는걸 의미한다.
그렇지만 reuse-db 옵션이 걸려있어도 PYTEST는 테스트가 돌때마다 매번 데이터베이스를 생성해준다.
데이터베이스가 이미 만들어져있는 경우, 에러가 발생하긴 하지만 내부적으로 예외처리해준다.
그리고 Pytest가 뜰 때, 디비를 사용하는 테스트코드던 아니던 항상 마이그레이트를 실행한다. 그래서 nomigration 옵션을 줘서, 마이그레이트가 돌지 않도록 꺼줘야한다.
참고 - --create-db - force re creation of the test database / --nomigrations - Disable Django 1.7+ migrations
2. conftest.py에 django_db_setup()함수 오버라이딩해두기
import pytest
@pytest.fixture(scope='session')
def django_db_modify_db_settings():
pass
pytest.ini에서 --nomigration 옵션을 줬다고 해서 마이그레이트가 전혀 안도는건 아니다.
@pytest.mark.django_db 옵션을 추가해주면 내부적으로 django_db_modify_db_settings함수를 호출하는데, 여기서 마이그레이트 명령문을 또 날린다! ㅠ..
그래서 이걸 오버라이딩시켜줘야 마이그레이트를 안돌린다.
conftest.py를 사용하지 않는 경우, 그냥 테스트 코드 클래스 안에서 재정의해줘도 된다.
참고 - Using an existing, external database for tests
'소프트웨어-이야기 > 테스트-자동화' 카테고리의 다른 글
[pytest] 함수의 매개변수로 기대한 값이 전달되었는지 확인하는 테스트코드 작성하기 (0) | 2018.07.14 |
---|---|
(Django) Rspec VS PyTest (0) | 2018.06.15 |
(테스트환경)로컬에 REDIS 환경 만들기 (0) | 2017.07.23 |
[rails]테스트코드 - Rspec (0) | 2017.04.22 |
[Rspec]:all VS :each 차이 (0) | 2016.06.10 |