PyTest 튜토리얼: 설치부터 작성, 실행까지 파이썬 테스트 마스터하기
PyTest란 무엇인가?
PyTest는 개발자가 파이썬 프로젝트를 위한 간결하고 확장 가능한 테스트 케이스를 작성할 수 있게 해주는 강력하고 오픈소스인 테스트 프레임워크입니다. 단위 테스트, 통합 테스트, 엔드투엔드 API 검사 등 모든 유형을 지원하며, 병렬 실행, 픽스처 주입, 매개변수화, 풍부한 리포팅을 기본 제공합니다.
왜 PyTest를 선택해야 할까?
- 보일러플레이트를 줄이는 단순하고 읽기 쉬운 문법
- 자동 테스트 발견과 실행
-k와 마커로 특정 테스트나 그룹 실행
pytest-xdist를 통한 병렬 실행 내장 지원
- 픽스처, 훅, 플러그인으로 확장 가능
- 무료이며 커뮤니티가 적극적으로 유지보수
PyTest 설치
pip로 최신 안정 버전 설치:
pip install pytest
설치 확인:
pytest --version
특정 버전 고정이 필요하면 예: pip install pytest==7.4.0
시작하기: 기본 테스트
프로젝트 디렉터리를 만들고 test_sample1.py라는 테스트 파일 추가:
import pytest
def test_file1_method1():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
assert x == y, "Values should match"
def test_file1_method2():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
테스트 스위트 실행:
pytest
출력 예시:
==================== test session starts ====================
collected 2 items
test_sample1.py F. [100%]
=================================== FAILURES ===================================
...
어설션 이해하기
PyTest 어설션은 표준 파이썬 assert 문과 동일하게 동작합니다. 실패 시 테스트 실행을 중단하고 정확한 위치와 메시지를 보고합니다:
assert "hello" == "Hai", "Mismatched greeting"
테스트 발견 규칙
- 파일명은
test_로 시작하거나 _test.py로 끝나야 함
- 테스트 함수는
test_로 시작해야 함
- 그 외 파일이나 함수는 명시 지정하지 않는 한 무시됨
특정 테스트 실행
디렉터리 내 모든 테스트 실행:
pytest
단일 파일 실행:
pytest test_sample1.py
부분 문자열로 필터링:
pytest -k method1 -v
마커로 실행:
pytest -m set1
병렬 실행
xdist 플러그인 설치 후 4워커 병렬 실행:
pip install pytest-xdist
pytest -n 4
픽스처 사용
재사용 가능한 설정 로직을 한 번 정의하고 테스트에 주입:
import pytest
@pytest.fixture
def supply_data():
return [25, 35, 45]
def test_compare_with_first(supply_data):
assert supply_data[0] == 25
픽스처 코드를 conftest.py에 두면 여러 테스트 모듈에서 공유 가능.
매개변수화 테스트
단일 테스트를 여러 입력으로 실행:
import pytest
@pytest.mark.parametrize("a, b, expected", [(5, 5, 10), (3, 5, 8)])
def test_add(a, b, expected):
assert a + b == expected
스킵과 예상 실패
마커로 결과를 오염시키지 않고 스킵하거나 실패 예상:
import pytest
@pytest.mark.skip(reason="Feature not yet available")
def test_future_feature():
pass
@pytest.mark.xfail(reason="Known bug")
def test_known_issue():
assert 1 == 2
XML 리포트 생성
CI 파이프라인용 JUnit 호환 XML 파일 생성:
pytest -v --junitxml=result.xml
실전 예제: 공개 API 테스트
아래는 https://reqres.in/을 테스트하는 최소 프레임워크입니다:
# conftest.py
import pytest
@pytest.fixture
def base_url():
return "https://reqres.in/api"
# test_list_user.py
import requests, json
import pytest
@pytest.mark.parametrize("user_id, first_name", [(1, "George"), (2, "Janet")])
def test_valid_user(base_url, user_id, first_name):
resp = requests.get(f"{base_url}/users/{user_id}")
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["data"]["id"] == user_id
assert data["data"]["first_name"] == first_name
def test_invalid_user(base_url):
resp = requests.get(f"{base_url}/users/50")
assert resp.status_code == 404
# test_login_user.py
import requests, json
import pytest
def test_login_success(base_url):
payload = {"email": "test@test.com", "password": "something"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["token"] == "QpwL5tke4Pnpja7X"
def test_login_missing_password(base_url):
payload = {"email": "test@test.com"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 400
assert data["error"] == "Missing password"
결론
이 튜토리얼은 PyTest 설치, 명확한 테스트 작성, 픽스처와 마커 활용, 병렬 실행, XML 리포트 생성, 간단한 API 테스트 스위트 구축을 다뤘습니다. 이 기초로 파이썬 테스트 관행을 자신 있게 확장할 수 있습니다.