Python/Python 심화

Python pytest를 이용한 테스트 자동화

임베디드 친구 2025. 8. 18. 19:49
반응형

Python pytest를 이용한 테스트 자동화

소프트웨어 개발에서 테스트는 필수적인 요소입니다. 특히 프로젝트가 커질수록 테스트를 수동으로 실행하는 것은 비효율적이며 오류가 발생하기 쉽습니다. Python에서 테스트 자동화를 구현하는 대표적인 도구로 pytest가 있습니다. 이 글에서는 pytest의 기본 사용법부터 고급 기능까지 살펴보고, 실제 코드 예제와 함께 테스트 자동화를 설정하는 방법을 알아보겠습니다.


pytest란 무엇인가?

pytest는 Python에서 가장 널리 사용되는 테스트 프레임워크 중 하나로, 간결하면서도 강력한 테스트 기능을 제공합니다. 다음은 pytest의 주요 특징입니다:

  • 간단한 문법
  • 뛰어난 확장성 (플러그인 지원)
  • 다양한 테스트 유형 지원 (단위 테스트, 기능 테스트 등)
  • 상세한 테스트 보고서 제공

설치를 위해 다음 명령어를 실행하세요:

pip install pytest

1. pytest 기본 사용법

테스트 함수 작성하기

pytest에서 테스트 함수는 test_로 시작하는 함수입니다. 다음은 간단한 예제입니다:

# math_functions.py
def add(a, b):
    return a + b

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

테스트 코드 작성:

# test_math_functions.py
from math_functions import add, subtract

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

def test_subtract():
    assert subtract(5, 3) == 2
    assert subtract(0, 1) == -1

테스트 실행하기

다음 명령어를 사용해 테스트를 실행할 수 있습니다:

pytest

결과:

======================== test session starts ========================
collected 2 items

test_math_functions.py ..                                      [100%]

========================= 2 passed in 0.02s =========================

2. pytest의 고급 기능

2.1 파라미터화된 테스트

pytest는 동일한 테스트 함수를 다양한 입력값으로 실행할 수 있도록 파라미터화를 지원합니다:

import pytest

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (0, 0, 0),
    (-1, -1, -2),
])
def test_add(a, b, expected):
    from math_functions import add
    assert add(a, b) == expected

2.2 예외 처리 테스트

특정 함수가 올바르게 예외를 발생시키는지 테스트하려면 pytest.raises를 사용합니다:

import pytest

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

def test_divide():
    with pytest.raises(ValueError, match="Cannot divide by zero"):
        divide(1, 0)

2.3 테스트 픽스처

테스트에서 반복적으로 사용되는 설정을 픽스처(fixture)로 정의할 수 있습니다:

import pytest

@pytest.fixture
def sample_data():
    return {"name": "John", "age": 30}

def test_sample_data(sample_data):
    assert sample_data["name"] == "John"
    assert sample_data["age"] == 30

2.4 커스텀 마커

테스트를 그룹화하거나 특정 조건에서 실행하도록 커스텀 마커를 추가할 수 있습니다:

import pytest

@pytest.mark.slow
def test_slow_function():
    import time
    time.sleep(5)
    assert True

실행 시 특정 마커를 포함한 테스트만 실행하려면 다음 명령어를 사용합니다:

pytest -m slow

3. 실제 프로젝트에서 pytest 사용

3.1 디렉토리 구조 설계

테스트 파일은 일반적으로 프로젝트의 루트 디렉토리에 위치한 tests/ 폴더에 저장합니다:

project/
├── math_functions.py
├── tests/
│   ├── __init__.py
│   ├── test_math_functions.py

4. pytest 플러그인

pytest의 강력함은 플러그인을 통해 확장됩니다. 다음은 인기 있는 플러그인들입니다:

  1. pytest-cov: 테스트 코드 커버리지 확인
    pip install pytest-cov
    pytest --cov=.
  2. pytest-django: Django 프로젝트 테스트 지원
  3. pytest-mock: 테스트에서 mock 객체 사용

5. 마무리

pytest는 Python 테스트 자동화를 위한 강력하고 유연한 도구입니다. 기본적인 사용법부터 고급 기능과 플러그인 활용까지, pytest를 사용하면 테스트를 효과적으로 관리하고 프로젝트의 품질을 높일 수 있습니다. 이 글에서 소개한 내용을 바탕으로 자신의 프로젝트에 pytest를 적용해 보세요!

반응형