pytest

pytest는 Python에서 자주 사용되는 테스트 프레임워크입니다.

함수 기반으로 테스트를 작성하고, 주로 assert로 올바른 결과가 나왔는지를 검사하는 방식으로 구현하게 됩니다.

여기서는 복잡한 기능은 다루지 않고, 간단한 사용법만 다뤄봅시다. BlueBase 프로젝트에서는 이 pytest를 사용해서 구현을 잘 했는지 확인하게 됩니다.

주요 기능

  • 간단한 문법: 테스트 코드를 작성할 때 클래스나 복잡한 구조가 필수적이지 않음.

  • 자동 테스트 탐색: test_ 접두사/접미사를 가진 함수나 파일을 자동으로 인식.

  • 강력한 assertion: Python의 기본 assert를 사용하지만 실패 시 가독성 높은 에러 메시지를 제공.

  • 플러그인 확장: coverage, mock 등 다양한 플러그인을 통한 확장성.

핵심 개념

  • test function: def test_xxx(): 형태의 함수로, 기대하는 동작을 검증하는 최소 단위.

  • fixture: 테스트 실행 전후에 필요한 준비/정리 코드를 재사용 가능하게 제공하는 기능.

  • marker(decorator): 특정 테스트를 구분하거나 조건부로 실행할 때 사용 (@pytest.mark.slow 등).

  • test discovery: 기본적으로 test_*.py 형식의 파일에서 테스트를 자동으로 탐색.

사용법 예시

1. 환경 설정

pytest는 표준 라이브러리가 아니기 때문에, 설치가 필요합니다.

uv add pytest

uv에 대한 설명은 해당 튜토리얼 문서를 참고해주세요.

2. 테스트 작성

Test-driven development (일명 TDD) 하에서는 테스트를 먼저 작성하는것을 권장합니다.

두 정수를 더하는 함수 add가 잘 동작하는지 테스트로 작성을 해봅시다.

예: ./test_utils.py

from utils import add, sub

def test_add():
    assert add(2, 3) == 5

def test_sub():
    assert sub(3, 2) == 1

3. 함수 작성

이제 실제 함수를 구현해봅시다.

예: ./utils.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

4. 테스트 실행

터미널에서 다음의 명령으로 테스트를 실행해봅시다:

uv run pytest

실행 결과는 테스트 함수별로 성공/실패 여부를 출력합니다. 실패 시에는 어떤 입력에서 예상과 다른 값이 나왔는지를 자세히 보여줍니다.

5. 특정 모듈만 테스트

기본적으로 pytest는 현재 디렉토리 아래에 있는 모든 test를 수집하고 실행합니다. 특정 모듈만 테스트 하고 싶은 경우, 인자로 파일명이나 모듈을 넣어주면 됩니다.

uv run pytest test_utils.py::test_sub