[PY-011][실무] pytest로 자동 테스트 시작하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[PY-011][실무] pytest로 자동 테스트 시작하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 97회 작성일 26-09-05 10:34

본문

[이번 수업]
자동 테스트는 사람이 손으로 확인하던 입력과 결과를 코드로 기록해 반복 실행하는 방법입니다. pytest로 정상값, 경계값, 잘못된 입력을 검사하고 실패 보고서를 읽는 흐름을 익힙니다. 작은 함수와 테스트 파일을 만들고 세 운영체제에서 검증합니다.

[선수지식]
PY-004의 함수와 모듈, PY-005의 가상환경과 pip, PY-007의 예외 처리를 알고 있으면 좋습니다.

[학습목표]
1. 테스트의 준비, 실행, 검증 단계를 구분합니다.
2. assert, raises, parametrize로 결과와 예외를 확인합니다.
3. 실패를 재현하고 최소 수정한 뒤 전체 테스트를 다시 실행합니다.

[핵심개념]
테스트 하나는 준비(Arrange), 실행(Act), 검증(Assert)으로 읽을 수 있습니다. 준비에서 입력과 상태를 만들고, 실행에서 대상 함수를 호출하며, 검증에서 실제 결과와 기대 결과를 비교합니다. pytest는 보통 test_로 시작하거나 _test로 끝나는 Python 파일과 test_로 시작하는 함수를 찾아 실행합니다. assert가 거짓이면 관련 값이 실패 보고서에 표시됩니다.

좋은 테스트는 언제 실행해도 같은 결과를 냅니다. 현재 시각, 무작위값, 외부 네트워크, 실행 순서에 몰래 기대면 간헐적으로 실패할 수 있습니다. 경계값은 조건이 바뀌는 바로 앞·해당 값·바로 뒤입니다. 인원 수가 양수여야 한다면 1은 정상 경계이고 0과 음수는 거부해야 합니다. 정상 경로뿐 아니라 잘못된 입력에서 의도한 예외가 발생하는지도 검사합니다.

parametrize는 같은 규칙을 여러 입력으로 반복 검사하고, fixture는 테스트에 필요한 임시 파일이나 공통 준비물을 제공합니다. 실패하면 실패한 입력, 기대값, 실제값, 첫 관련 코드 위치부터 읽습니다. 재현되는 실패를 남기고 코드를 최소로 고친 뒤 해당 테스트와 전체 테스트를 실행하세요. 검증을 지우거나 기대값을 오류에 맞춰 바꾸면 안 됩니다.

[따라하기]
연습 폴더에 calculator.py를 만들고 다음 코드를 저장하세요.

def split_bill(total: int, people: int) -> int:
    if total < 0:
        raise ValueError("total must be non-negative")
    if people <= 0:
        raise ValueError("people must be positive")
    return total // people

같은 폴더에 test_calculator.py를 만듭니다.

import pytest
from calculator import split_bill

@pytest.mark.parametrize(
    "total,people,expected",
    [(10_000, 2, 5_000), (9_999, 3, 3_333)],
)
def test_split_bill(total: int, people: int, expected: int) -> None:
    assert split_bill(total, people) == expected

def test_rejects_zero_people() -> None:
    with pytest.raises(ValueError, match="people must be positive"):
        split_bill(10_000, 0)

macOS와 Linux에서는 python3 -m venv .venv, source .venv/bin/activate, python -m pip install pytest를 차례로 실행합니다. Windows PowerShell에서는 py -m venv .venv, .venv\Scripts\Activate.ps1, python -m pip install pytest를 실행합니다. 이어서 모든 환경에서 python -m pytest -q를 실행하세요. 버전과 시간은 달라도 마지막에는 3 passed가 표시됩니다.

[흔한 실수]
테스트 파일 이름이 규칙과 달라 수집되지 않았는데 성공했다고 착각하지 마세요. 구현 내부의 임시 변수까지 검사하면 리팩터링이 어려워집니다. 여러 동작을 한 테스트에 섞거나 실패한 테스트만 고른 뒤 전체 테스트를 생략하지 마세요. 소수 계산은 == 대신 허용 오차나 pytest.approx가 필요할 수 있습니다.

[보안 주의]
본인 소유의 로컬·격리 환경과 가상 데이터로만 실습합니다. 테스트에 실제 비밀번호, API 키, 개인정보, 운영 데이터베이스 주소를 넣지 마세요. 외부 서비스는 가짜 구현으로 바꾸고 실제 연동은 허가된 환경에서만 수행합니다. 파일은 tmp_path 같은 임시 공간에 만들고, 플러그인은 공식 출처와 버전을 확인합니다.

[직접 해볼 과제]
people이 -1일 때 ValueError가 발생하는 사례와 total이 0, people이 1일 때 결과가 0인 사례를 추가하세요. 먼저 예상 테스트 수를 적고 실행 결과와 비교합니다. 실패 하나를 일부러 만든 뒤 보고서에서 실제값과 기대값이 표시된 줄도 찾아 기록하세요.

[확인문제]
1. 준비, 실행, 검증 단계는 각각 무엇을 하나요?
2. 같은 규칙을 여러 입력으로 검사할 때 어떤 기능을 사용하나요?
3. 외부 네트워크와 현재 시각에 직접 의존하는 테스트가 불안정한 이유는 무엇인가요?

[다음 학습]
다음 차례인 JSTS-011에서 JavaScript 입력 검증과 보안을 다룹니다. PY 트랙에서는 PY-012에서 테스트한 함수를 HTTP API를 사용하는 명령줄 프로젝트로 확장합니다.

[공식 참고 자료]
pytest 시작 안내
https://docs.pytest.org/en/stable/getting-started.html
pytest assert와 예외 검증
https://docs.pytest.org/en/stable/how-to/assert.html
pytest fixture 설명
https://docs.pytest.org/en/stable/explanation/fixtures.html
pytest parametrize 사용법
https://docs.pytest.org/en/stable/how-to/parametrize.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,642
어제
6,862
최대
16,772
전체
770,593
Copyright © 소유하신 도메인. All rights reserved.