오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Web Programming/Django

[pytest] Trouble Shooting

junha6316 2021. 11. 6. 14:44

1. 여러개의 데이터베이스를 사용할 때

프로덕트에서 부하 부담의 이유로 replica 데이터베이스를 사용하고 있고 테스트 데이터 베이스를 따로 사용하고 있다면 제대로 테스트가 돌아가지 않을 수 있다. 데이터가 작성되는 곳은 마스터 데이터베이스이고 읽어올때는 replica 데이터 베이스에서 읽어오기 때문이다. 물론 테스트 데이터베이스도 동일하게 구성 할 수 있지만 온갖 설정을 피하고 싶을때 아래처럼 사용하면 된다.

@pytest.fixture(autouse=True)
def mock_BaseManager(mocker):
    mocker.patch(
        "companies.models.Company.objects.using",
        return_value=Company.objects.using("default"),
    )
    return

2.  post 데이터에 리스트를 보낼 때

아무리 리스트를 보내도 API에서 하나만 인식하는 문제가 있었다. 이럴 때는 꼭 content_type을 작성하도록 하자.

res = client.post(
        SOMEWHERE_URL,
        data={
            "age": 100,
            "dune_list": ['dune1', 'dune2', 'dune3', 'dune4']
        }, content_type='application/json', # 이거 찾느라 꽤 고생했다.
    )

3. 특정 테스트만 실행하고 싶을 때

테스트를 작성할 때 마다 파일내에 모든 테스트를 실행시키는건 불합리하다. 아래명령어를 통해 하나의 테스트만 실행하자.

pytest this/is/test_file/directory/test_abc.py::test_function

4. 테스트를 하면서 출력을 보고 싶을 때

pytest -s 테스트/디렉토리/

5. 경우의 수를 작성해야할 때

테스트를 작성하다보면 여러가지 요소들을 다양한 조합으로 테스트 해야할 때가 있다. 아래와 같이 parametrize를 사용해보자

@pytest.mark.parametrize('country' , ['한국', '일본','중국', '미국'])
@pytest.mark.parametrize('sex',['남성','여성','기타'])
@pytest.mark.parametrize('age', [f'{i}대' for i in range(1, 10)])
def test_something(country, sex, age):
    print(country, sex, age)
    assert True

위와 같이 작성하면 총 4*3*9 의 테스트를 작성할 수 있다.