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문을 무시할 수가 있는 것이다.
커버리지란, 전체 제품 코드 라인 수 중에서 테스트 중 한번이라도 실행된 제품 코드 라인 수 이다.
즉 얼마나 테스트 코드가 제품 코드를 실행해보고 있는지를 나타내는 수치라고 볼 수 있다. 당연하게도 커버리지는 높을 수록 좋으며 그만큼 테스트 결과가 제품의 완성도를 보장할 수 있다는 것이다.
pip install coverage
coverage를 다운로드 받았다면,
우선 해야할 작업은 테스트 코드와 제품 코드를 분리하는 것이다.
이 작업을 하는 이유는 앞서 말한 커버리지 계산식에서 테스트 코드가 포함되는 것을 막기 위함이다. 계산 내용에 분모 분자 모두 제품 코드만 들어간다. 따라서 test_*.py형식의 파이썬 코드로 테스트 코드를 넣어서 테스트 코드가 제품 코드에 들어가는 것을 방지하도록 하자.
coverage run -m pytest test_*.py # pytest를 실행하면서 커버리지 측정하기
coverage report -m # 커버리지 요약과 함께 테스트 누락된 제품 라인 보기
coverage html # 커버리지 진단 결과 html문서로 정리
이와 같이 사용을 하는데, run의 m옵션은 --module을 의미하며 coverage가 파이썬 프로세스를 제어하기 때문에 모듈 실행 형태로 pytest를 실행해야 하기 때문이다.
여기서 말하는 '모듈 형태로 실행'이 무슨 뜻인지는 다음 번에 설명하는 글을 작성하도록 하겠다.