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을 통하여 받을 수 있는 방법과 병렬 테스트(시간이 훨씬 줄어드는)에 대해 알아보도록 하겠다.