Python/Python 심화

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

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

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를 적용해 보세요!

728x90
반응형