Pytest로 테스트하기
Pytest로 테스트하기
Pytest로 시작하기: 기초부터 실전까지
Python에서 테스트를 자동화하는 것은 코드의 신뢰성을 높이고, 유지보수를 쉽게 하는 데 필수적입니다. pytest
는 Python의 대표적인 테스트 프레임워크로, 간결한 코드 작성과 강력한 기능을 제공합니다.
1. Pytest 설치
Pytest는 pip
를 통해 쉽게 설치할 수 있습니다. 먼저, 아래 명령어로 pytest
를 설치하세요:
pip install pytest
설치가 완료되면 pytest
명령어가 실행 가능한지 확인할 수 있습니다:
pytest --version
2. 기본 테스트 함수 작성
pytest
로 테스트를 작성하는 가장 기본적인 방법은, test_
로 시작하는 함수를 정의하는 것입니다. 아래 예제는 두 수의 합을 테스트하는 단순한 코드입니다.
예제 코드: test_math.py
# 함수 정의
def add(a, b):
return a + b
# 테스트 함수
def test_add():
assert add(2, 3) == 5 # 테스트가 통과할 조건
assert add(1, 1) == 2 # 또 다른 테스트 조건
3. 테스트 실행
테스트를 실행하려면, 터미널에서 해당 디렉터리로 이동한 후 pytest
명령어를 실행하면 됩니다.
pytest
출력 예시:
==================== test session starts ====================
collected 1 item
test_math.py . [100%]
===================== 1 passed in 0.03s =====================
여기서 .
는 테스트가 성공적으로 통과했음을 의미합니다.
4. 테스트 함수에 다양한 입력값 적용하기 (Parameterize)
pytest
의 유용한 기능 중 하나는 같은 테스트 함수에 여러 입력값을 적용해 테스트를 확장하는 것입니다. 이를 @pytest.mark.parametrize
데코레이터를 사용하여 구현할 수 있습니다.
예제 코드: 매개변수화된 테스트
import pytest
@pytest.mark.parametrize("a, b, expected", [
1, 2, 3), # 첫 번째 테스트 케이스
(2, 3, 5), # 두 번째 테스트 케이스
(5, 5, 10), # 세 번째 테스트 케이스
(
])def test_add(a, b, expected):
assert add(a, b) == expected
이제 같은 테스트 함수에서 다양한 입력값을 한 번에 처리할 수 있습니다.
5. 예외 처리 테스트하기
때로는 함수가 올바르게 예외를 발생시키는지 테스트할 필요가 있습니다. pytest
는 이를 위해 pytest.raises
컨텍스트 매니저를 제공합니다.
예제 코드: 예외 처리 테스트
def divide(a, b):
if b == 0:
raise ValueError("0으로 나눌 수 없습니다.")
return a / b
def test_divide():
with pytest.raises(ValueError): # ValueError 예외가 발생해야 테스트 통과
10, 0) divide(
6. Pytest의 장점: 디렉토리 구조와 자동 탐지
pytest
는 테스트 파일을 자동으로 탐지합니다. 보통 test_
로 시작하는 파일과 함수, 혹은 _test.py
로 끝나는 파일을 찾아서 실행합니다. 프로젝트 규모가 커지면 다음과 같은 디렉토리 구조를 자주 사용합니다:
project/
│
├── src/
│ └── my_module.py
│
└── tests/
├── test_my_module.py
tests/
디렉토리에 여러 테스트 파일을 두고 pytest
를 실행하면 모든 테스트가 자동으로 실행됩니다.
7. 테스트 보고서 보기
테스트를 실행하면 기본적으로 콘솔에 간략한 성공/실패 정보를 출력하지만, 더 상세한 정보를 보고 싶다면 -v
옵션을 추가할 수 있습니다.
pytest -v
출력 예시:
==================== test session starts ====================
collected 1 item
test_math.py::test_add PASSED [100%]
===================== 1 passed in 0.01s =====================
8. 실패한 테스트 재실행
테스트가 실패할 경우, --maxfail
옵션을 통해 실패한 테스트에서 바로 중단할 수 있습니다. 또한 --rerun
옵션을 사용하여 실패한 테스트만 다시 실행할 수도 있습니다.
pytest --maxfail=1 --rerun 2