Filling In the Gaps in Coverage
한국어 원문으로 표시합니다.
목표
테스트를 쓰는 법이 아니라 무엇을 테스트할지 고르는 법을 익힙니다. 커버리지를 목표가 아니라 지도로 씁니다.
왜 중요한가
커버리지 100%는 아무것도 보장하지 않습니다. assert x is not None 만
있어도 100%가 됩니다. 반대로 진짜 위험한 곳(오류 처리, 경계값)은 테스트를
쓰기 귀찮아서 비어 있고, 정확히 그래서 버그가 삽니다.
이 실습은 그 빈칸을 숫자로 찾아 메우고, 마지막에는 안 채울 곳을 정하는 것으로 끝납니다.
환경
pytest --cov=<모듈> --cov-report=term-missing
pytest --cov-branch 분기 커버리지
pytest --durations=5 느린 테스트 다섯 개
네트워크가 없지만 pytest·coverage·hypothesis 는 이미지에 들어 있습니다.
단계
- 분기 셋짜리 함수 →
/root/work/tt/billing.py - 정상 경로만 테스트 →
test_billing.py - 빠진 줄 확인 →
/root/work/tt/03-cov.txt - 오류 경로 채우기
- 분기 커버리지 →
/root/work/tt/05-branch.txt - hypothesis 로 성질 검증
- 느린 테스트 →
/root/work/tt/07-slow.txt - 안 테스트할 것 →
/root/work/tt/08-verdict.md
참고
- 테스트 파일 이름은
test_로 시작해야 pytest 가 찾습니다. --cov=billing의 이름은 파일 이름이지 경로가 아닙니다.- hypothesis 는 실패하는 입력을 찾으면 가장 작은 반례로 줄여 보여 줍니다.
테스트할 코드를 만든다
분기 셋짜리 함수 → /root/work/tt/billing.py
/root/work/tt/billing.py 를 만듭니다. 함수 하나면 됩니다 — discount(price, rate) 가 (1) rate 가 0~1 밖이면 ValueError (2) price 가 음수면 ValueError (3) 아니면 반올림한 정수를 돌려주도록. 분기가 셋이라 커버리지를 읽기 좋습니다.
첫 테스트
정상 경로만 테스트 → test_billing.py
같은 폴더에 test_billing.py 를 만들고 정상 경로 하나만 테스트합니다. pytest -q 로 통과시키세요. 아직 오류 경로는 건드리지 않습니다 — 다음 단계에서 커버리지가 그걸 짚어 줍니다.
빠진 줄을 본다
빠진 줄 확인 → /root/work/tt/03-cov.txt
pytest --cov=billing --cov-report=term-missing -q 를 돌리고 결과를 /root/work/tt/03-cov.txt 에 저장하세요. Missing 열에 오류 처리 줄 번호가 나와야 합니다. 숫자가 아니라 그 줄 번호가 답입니다.
빈칸을 메운다
오류 경로 채우기
오류 경로 두 개에 테스트를 더합니다. pytest.raises(ValueError) 를 씁니다. 다시 재면 커버리지가 100%가 되어야 합니다.
분기 커버리지는 다르다
분기 커버리지 → /root/work/tt/05-branch.txt
pytest --cov=billing --cov-branch --cov-report=term-missing -q 로 다시 재고 /root/work/tt/05-branch.txt 에 저장하세요. 줄 커버리지가 100%여도 분기가 100%가 아닐 수 있습니다 — 그 차이를 보는 것이 목적입니다.
사람이 못 떠올리는 입력
hypothesis 로 성질 검증
hypothesis 로 속성 기반 테스트를 하나 씁니다. @given(st.integers(min_value=0, max_value=10**6), st.floats(min_value=0, max_value=1)) 로 '결과는 항상 price 이하' 같은 성질을 검증하세요. 예시를 나열하는 대신 규칙을 적는 것이 차이입니다.
느린 테스트를 골라낸다
느린 테스트 → /root/work/tt/07-slow.txt
pytest --durations=5 -q 로 가장 느린 다섯 개를 봅니다. 결과를 /root/work/tt/07-slow.txt 에 저장하세요. 느린 테스트는 안 돌리게 되고, 안 돌리는 테스트는 없는 것보다 나쁩니다.
무엇을 안 테스트할지 정한다
안 테스트할 것 → /root/work/tt/08-verdict.md
/root/work/tt/08-verdict.md 에 세 줄. (1) 이 모듈에서 반드시 테스트해야 하는 것 (2) 테스트하지 않기로 한 것 (3) 그 이유. 100%를 목표로 삼지 않는 것이 이 실습의 결론입니다.