Backend/FastAPI

[TDD] FastAPI에서 pytest 로 단위테스트 하기 - 3. pytest 에서 Parameterize 사용법

amelia-suyeon 2024. 2. 18. 17:44

이번에는 본격적으로 테스트 파일을 만들면서, 여러가지 Request를 보내는 Parameterize 사용법에 대해 설명하겠다.

 

먼저, parameterize란 무엇일까?

테스트 케이스마다 테스트 값을 포함한 테스트 함수를 호출하는 코드도 중복 작성하는 부분이다. 

@pytest.mark.parametrize(args, argvalues) 데코레이터로 작성하여 테스트 코드를 간결하게 만들 수 있다. 

 

(필자의 경우 -> 테스트 값을 포함하지 않았다. -  통신 200이 목적이었기 때문에)

 

그렇다면, 어떻게 적용했는지 코드를 통해서 보자

 

import pytest

from fastapi.testclient import TestClient
from main import start_app

app = start_app()
client = TestClient(app)

@pytest.mark.parametrize(
    "request_data",
    [
        ({
            "type": "edu1",
            "region": "edu1",
            "area": "5",
            "value": "outlier",
            "start_date": "2024-01-30",
            "end_date": "2024-01-30"
        }),
        ({
            "type": "lease",
            "region": "mylease1",
            "area": "2",
            "value": "outlier",
            "start_date": "2024-01-30",
            "end_date": "2024-01-30"
        }),
        ({
            "type": "business",
            "region": "mysb2",
            "area": "2",
            "value": "outlier",
            "start_date": "2024-01-30",
            "end_date": "2024-01-30"
        })
        
        
    ]
)



def test_get_inoutdata(request_data):
    response = client.post("/api/excel/inoutdata", json=request_data)
    assert response.status_code == 200

 

 

@pytest.mark.parametrize(args, argvalues) 를 사용할 때는 꼭 import pytest를 해줘야 한다.

위의 코드에서 보면, reuqeust_data에 list로 형식에 맞춘 req 묶음을 넣어주었다.

 

실제로 결과를 실행해보면, 아래와 같이 하나의 함수 속에 ... 이 3개 인것을 볼 수 있다.

 

 

이러한 방식으로 다른 API test도 테스트 해보고 싶은 type 별로, 통신 테스트를 해보면 좋을 것 같다.

필자의 예시 -> 전체 pytest를 돌렸을때, 아래와 같이 전체 테스트가 된 것을 볼 수 있다.

 

사실, 프로그램이 돌아가는 것에만 신경쓴다면 위 처럼 간단하게 실행하면 된다. 하지만 다른 부서 혹은 회사에서 단위 테스트 혹은 통합 테스트에 대한 결과물을 작성하는 것은 여간 귀찮은 일이 아니다. 

 

따라서 다음 포스팅에서는, 테스트 결과를 html을 통하여 받을 수 있는 방법과 병렬 테스트(시간이 훨씬 줄어드는)에 대해 알아보도록 하겠다.