C
Python/테스트/Lesson 22

pytest 시작하기

1시간·theory
Python

pytest 시작하기

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ Python 이 AI/데이터 표준 언어가 됐는지
  • ✅ Python 3.x 기준 venv + requirements.txt 셋업
  • ✅ print / input / type / dir 4개 내장 함수

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

pytest — 코드 + 실행 결과

pytest = Python 테스트 표준 (Django·FastAPI·numpy 등). 함수 이름이 test_ 로 시작하면 자동 인식.


1. 설치 + 첫 테스트

bash
$ pip install pytest
python
# test_math.py
def 더하기(a, b):
    return a + b

def test_더하기_정상():
    assert 더하기(2, 3) == 5

def test_더하기_음수():
    assert 더하기(-1, -1) == -2
bash
$ pytest test_math.py
# ============= 2 passed in 0.05s =============

2. 실패 시 자세한 에러

python
def test_실패():
    assert 더하기(2, 3) == 6        # ❌ 5 != 6
code
FAILED test_math.py::test_실패
assert 5 == 6
 +  where 5 = 더하기(2, 3)

3. 예외 검증

python
import pytest

def 나누기(a, b):
    if b == 0:
        raise ValueError("0 으로 나누기 불가")
    return a / b

def test_0으로_나누면_예외():
    with pytest.raises(ValueError, match="불가"):
        나누기(10, 0)

4. 파라미터화 — 여러 케이스 한 번에

python
import pytest

@pytest.mark.parametrize("a, b, 기대", [
    (2, 3, 5),
    (-1, -1, -2),
    (0, 0, 0),
    (100, 200, 300),
])
def test_더하기(a, b, 기대):
    assert 더하기(a, b) == 기대

# 4 개 테스트가 자동 실행

5. fixture — 공통 준비

python
import pytest

@pytest.fixture
def 사용자():
    return {"이름": "홍길동", "나이": 28}

def test_이름(사용자):                       # fixture 자동 주입
    assert 사용자["이름"] == "홍길동"

def test_나이(사용자):
    assert 사용자["나이"] >= 18

한 줄 요약

def test_X(): assert ... + parametrize + fixture 3개로 95%.

💻 pytest 기본 사용법
# 설치: pip install pytest

# test_example.py
def test_addition():
    assert 1 + 1 == 2

def test_string():
    assert "hello".upper() == "HELLO"

# 예외 테스트
import pytest

def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

# 파라미터화 테스트
@pytest.mark.parametrize("input,expected", [
    (1, 1),
    (2, 4),
    (3, 9),
])
def test_square(input, expected):
    assert input ** 2 == expected

# 마커 (조건부 실행)
@pytest.mark.skip(reason="아직 미구현")
def test_not_implemented():
    pass

@pytest.mark.skipif(True, reason="조건부 스킵")
def test_conditional():
    pass

# 실행
# pytest                    # 모든 테스트
# pytest test_example.py    # 특정 파일
# pytest -v                 # 상세 출력
# pytest -k "square"        # 이름 필터

💡 핵심 포인트

1. 파일명: test_.py 또는 _test.py
2. 함수명: test_ 접두사
3. assert 문 하나로 간단히 검증

Python은 간결하고 읽기 쉬운 문법으로 다양한 분야에 활용됩니다. 인터프리터 언어로 REPL 환경에서 즉시 실행 가능합니다. PEP 8 코딩 스타일 가이드를 따르고, Black/autopep8으로 자동 포맷팅합니다. 타입 힌트(type hints)로 코드 가독성과 IDE 지원을 향상시킵니다. pip로 패키지 관리, venv/conda로 가상환경을 구성합니다.

🐍 실행해보기 — pytest 시작하기

위 개념을 실제로 코드로 실행해보세요. 값을 바꿔가며 어떻게 동작하는지 직접 확인하는 게 가장 빠른 학습.
✏️ Python 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
🐍 Pyodide로 실제 Python 실행 — 첫 실행 시 로딩 3~5초 소요

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 함수에 pytest 단위 테스트 + parametrize 추가해줘"
  • "이 fixture 를 conftest.py 로 추출해줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

먼저 읽으면 좋은 개념: 비동기 프로그래밍 소개
다음 추천: 파일 입출력
pytest 입문 - Python