Python 24일 코스 - Day 21: 테스트 pytest

Day 21: 테스트 pytest

pytest 설치와 첫 테스트

pip install pytest
# calculator.py
def add(a, b):
    return a + b

def divide(a, b):
    if b == 0:
        raise ValueError("0으로 나눌 수 없습니다")
    return a / b
# test_calculator.py
from calculator import add, divide
import pytest

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

def test_divide():
    assert divide(10, 2) == 5.0
    assert divide(7, 2) == 3.5

def test_divide_by_zero():
    with pytest.raises(ValueError):
        divide(10, 0)

테스트 실행

pytest                    # 전체 테스트
pytest test_calculator.py # 특정 파일
pytest -v                 # 상세 출력
pytest -k "test_add"      # 이름으로 필터링

fixture로 테스트 데이터 준비

import pytest

@pytest.fixture
def sample_users():
    return [
        {"name": "철수", "age": 25},
        {"name": "영희", "age": 30},
        {"name": "민수", "age": 22},
    ]

def test_user_count(sample_users):
    assert len(sample_users) == 3

def test_youngest_user(sample_users):
    youngest = min(sample_users, key=lambda u: u["age"])
    assert youngest["name"] == "민수"

parametrize로 여러 케이스 테스트

@pytest.mark.parametrize("input_val, expected", [
    (1, False),
    (2, True),
    (3, True),
    (4, False),
    (17, True),
    (20, False),
])
def test_is_prime(input_val, expected):
    assert is_prime(input_val) == expected

테스트 구조 모범 사례

project/
├── src/
│   ├── calculator.py
│   └── user.py
├── tests/
│   ├── test_calculator.py
│   └── test_user.py
└── pytest.ini

오늘의 연습문제

  1. 문자열 유틸리티 함수 3개를 만들고 각각 테스트를 작성하세요.
  2. BankAccount 클래스에 대한 테스트를 fixture와 함께 작성하세요.
  3. parametrize를 사용하여 이메일 검증 함수를 다양한 입력으로 테스트하세요.

이 글이 도움이 되었나요?