programming language/Python

Pytest 사용법

metamong-data 2025. 2. 10. 22:56
728x90
반응형

1. Pytest 설치

pip install pytest pytest-mock

2. 기본적인 테스트 작성

(1) 간단한 테스트

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

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

테스트 실행:

pytest

(2) 예외 처리 테스트

import pytest

def divide(x, y):
    if y == 0:
        raise ValueError("Cannot divide by zero!")
    return x / y

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

3. 테스트 클래스 사용하기

class TestMathOperations:
    def test_addition(self):
        assert 2 + 3 == 5

    def test_multiplication(self):
        assert 2 * 3 == 6

4. 파라미터화된 테스트

import pytest

@pytest.mark.parametrize("a, b, expected", [
    (2, 3, 5),
    (1, 2, 3),
    (0, 0, 0),
])
def test_add(a, b, expected):
    assert a + b == expected

5. 테스트 실행 방식

pytest -v               # 상세 출력
pytest -q               # 최소한의 출력
pytest --maxfail=2      # 최대 2개의 실패 후 중단
pytest -k "add"         # "add"가 포함된 테스트만 실행
pytest test_sample.py   # 특정 파일만 실행

6. 픽스처(Fixtures) 사용

import pytest

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

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

7. Mocking (의존성 제거)

(1) 기본적인 Mocking

from unittest.mock import MagicMock

def test_mock_example():
    mock = MagicMock(return_value=10)
    assert mock() == 10

(2) pytest-mock을 활용한 Mocking

pytest-mock을 활용하면 간편하게 특정 함수나 객체를 모킹할 수 있습니다.

예제: 특정 함수의 호출을 모킹하기

import pytest

def fetch_data():
    return "Real Data"

def test_fetch_data(mocker):
    mock_fetch = mocker.patch("__main__.fetch_data", return_value="Mocked Data")
    assert fetch_data() == "Mocked Data"
    mock_fetch.assert_called_once()

예제: 특정 객체의 메서드 모킹하기

class Database:
    def get_user(self, user_id):
        return {"id": user_id, "name": "Original User"}

def test_get_user(mocker):
    db = Database()
    mocker.patch.object(db, "get_user", return_value={"id": 1, "name": "Mocked User"})
    assert db.get_user(1) == {"id": 1, "name": "Mocked User"}

pytest-mock을 활용하면 특정 기능을 테스트할 때 외부 의존성을 제거하고, 테스트의 정확성을 높일 수 있습니다.

728x90