pytest 기본 사용법과 구조 이해
pytest
는 파이썬에서 가장 널리 사용되는 테스트 프레임워크 중 하나입니다.unittest
보다 문법이 간결하고 직관적이며, 강력한 플러그인 생태계를 자랑합니다.
1. 설치하기
pip install pytest
2. 가장 기본적인 테스트 파일
📁 test_math.py
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
3. 실행 방법
pytest
해석:
- 함수 이름은 반드시
test_
로 시작해야 합니다. assert
키워드만으로 검증 가능 →self.assertEqual()
보다 간결- 실행 시 자동으로
test_*.py
파일을 찾아 테스트 수행
parametrize 고급처리, 예외 처리, fixture
1. 다양한 인풋 테스트 - parametrize
import pytest
@pytest.mark.parametrize("a,b,expected", [
(2, 3, 5),
(10, 5, 15),
(1, -1, 0)
])
def test_add(a, b, expected):
assert a + b == expected
해석:
@pytest.mark.parametrize
데코레이터로 여러 케이스를 한 번에 테스트할 수 있습니다.- 각 조합이 하나의 테스트로 실행되므로 코드 중복 없이 커버리지를 넓힐 수 있습니다.
2. 예외 발생 테스트
def divide(x, y):
if y == 0:
raise ValueError("0으로 나눌 수 없습니다.")
return x / y
def test_divide_zero():
with pytest.raises(ValueError):
divide(10, 0)
해석:pytest.raises()
는 특정 함수에서 예외가 발생하는지 검증할 때 사용합니다.
단순하고 읽기 쉬운 구문으로 예외 처리 테스트가 가능합니다.
3. 공통 준비 작업 - fixture
@pytest.fixture
def sample_data():
return {"user": "admin", "role": "manager"}
def test_user_role(sample_data):
assert sample_data["role"] == "manager"
해석:
@pytest.fixture
는 테스트 함수에 공통 데이터를 주입합니다.- 테스트 환경 구성, DB 연결, 초기값 설정 등에 활용됩니다.
실무 팁과 플러그인 활용
1. 실패 테스트만 다시 실행
pytest --lf # last failed
마지막으로 실패한 테스트만 다시 실행하여 디버깅 속도를 높일 수 있습니다.
2. 테스트 중간에 print 보기
pytest -s
print()
구문이 테스트 결과에 출력되지 않는 경우 -s
옵션을 사용하세요.stdout
출력을 보기 위해 디버깅할 때 유용합니다.
3. 테스트 시간 측정
pip install pytest-timeout
pytest --durations=5
--durations
옵션은 가장 오래 걸린 테스트를 출력하여 속도 병목을 찾는 데 유용합니다.
4. 코드 커버리지 확인
pip install pytest-cov
pytest --cov=패키지명
pytest-cov
플러그인을 사용하면 테스트 커버리지(테스트된 코드 비율)를 확인할 수 있습니다.
CI 환경에서도 자주 사용됩니다.
5. 테스트 디렉토리 구조 추천
project/
├── app/
│ ├── __init__.py
│ └── logic.py
├── tests/
│ ├── __init__.py
│ └── test_logic.py
tests/
디렉터리에 모든 테스트 파일을 분리해 관리하면 프로젝트 규모가 커져도 유지하기 쉽습니다. pytest
는 간결한 문법과 풍부한 기능으로 파이썬 테스트의 표준으로 자리 잡았습니다. 단순한 유닛 테스트를 넘어서, 예외 처리, 파라미터 조합, 성능 측정, 커버리지 분석까지 가능한 강력한 도구입니다. 처음에는 assert
와 test_
함수부터 시작해보고,
점차 fixture
, parametrize
, mock
등 고급 기능도 익혀보세요. 지금 여러분이 작성한 코드에 신뢰성과 품질을 더해주는 첫걸음이 될 것입니다.