pytest

권도현·2025년 10월 13일

pytest는 테스트 자동화 프레임워크이다.
test_*.py형태의 파일 이름을 갖는 테스트 파일을 인식하고 결과를 리포트 해준다.

/test_sample.py
# 제품 코드
def add(a:int,b:int)->int:
    return a+b
# 테스트 코드
def test_simple()->None:
    # Given
    a,b=1,1
    # When
    result=add(a,b)
    # Then
    assert result==2

pytest는 python의 assertstatement를 사용한다.
assert이사이트에 의하면

assert_stmt: "assert" expression ["," expression]
if __debug__:
    if not expression: raise AssertionError
if __debug__:
    if not expression1: raise AssertionError(expression2)

AssertionError를 반환하는 명령어이다.
__debug__None, True, False중 하나의 값을 갖는 전역 상수로 파이썬이 디버그 모드로 실행되면 True값을 갖는다.

python -O test.py

-O옵션으로 최적화 모드로 실행하면 __debug__False로 assert문을 무시할 수가 있는 것이다.

coverage

커버리지란, 전체 제품 코드 라인 수 중에서 테스트 중 한번이라도 실행된 제품 코드 라인 수 이다.
즉 얼마나 테스트 코드가 제품 코드를 실행해보고 있는지를 나타내는 수치라고 볼 수 있다. 당연하게도 커버리지는 높을 수록 좋으며 그만큼 테스트 결과가 제품의 완성도를 보장할 수 있다는 것이다.

pip install coverage

coverage를 다운로드 받았다면,
우선 해야할 작업은 테스트 코드와 제품 코드를 분리하는 것이다.
이 작업을 하는 이유는 앞서 말한 커버리지 계산식에서 테스트 코드가 포함되는 것을 막기 위함이다. 계산 내용에 분모 분자 모두 제품 코드만 들어간다. 따라서 test_*.py형식의 파이썬 코드로 테스트 코드를 넣어서 테스트 코드가 제품 코드에 들어가는 것을 방지하도록 하자.

coverage run -m pytest test_*.py # pytest를 실행하면서 커버리지 측정하기
coverage report -m # 커버리지 요약과 함께 테스트 누락된 제품 라인 보기
coverage html # 커버리지 진단 결과 html문서로 정리

이와 같이 사용을 하는데, runm옵션은 --module을 의미하며 coverage가 파이썬 프로세스를 제어하기 때문에 모듈 실행 형태로 pytest를 실행해야 하기 때문이다.
여기서 말하는 '모듈 형태로 실행'이 무슨 뜻인지는 다음 번에 설명하는 글을 작성하도록 하겠다.

profile
weeeeeeeee!

0개의 댓글