본문 바로가기

소프트웨어 이야기/테스트 자동화

(Django) 마이그레이트를 하지 않고 PyTest 사용하기

백그라운드

요즘 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 옵션을 줘서, 마이그레이트가 돌지 않도록 꺼줘야한다.



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