LabHub
배우기 러닝패스 코스

Testing Tools in Practice

Filling In the Gaps in Coverage

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

테스트를 쓰는 법이 아니라 무엇을 테스트할지 고르는 법을 익힙니다. 커버리지를 목표가 아니라 지도로 씁니다.

왜 중요한가

커버리지 100%는 아무것도 보장하지 않습니다. assert x is not None 만 있어도 100%가 됩니다. 반대로 진짜 위험한 곳(오류 처리, 경계값)은 테스트를 쓰기 귀찮아서 비어 있고, 정확히 그래서 버그가 삽니다.

이 실습은 그 빈칸을 숫자로 찾아 메우고, 마지막에는 안 채울 곳을 정하는 것으로 끝납니다.

환경

pytest --cov=<모듈> --cov-report=term-missing
pytest --cov-branch      분기 커버리지
pytest --durations=5     느린 테스트 다섯 개

네트워크가 없지만 pytest·coverage·hypothesis 는 이미지에 들어 있습니다.

단계

  1. 분기 셋짜리 함수 → /root/work/tt/billing.py
  2. 정상 경로만 테스트 → test_billing.py
  3. 빠진 줄 확인 → /root/work/tt/03-cov.txt
  4. 오류 경로 채우기
  5. 분기 커버리지 → /root/work/tt/05-branch.txt
  6. hypothesis 로 성질 검증
  7. 느린 테스트 → /root/work/tt/07-slow.txt
  8. 안 테스트할 것 → /root/work/tt/08-verdict.md

참고

테스트할 코드를 만든다

분기 셋짜리 함수 → /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%를 목표로 삼지 않는 것이 이 실습의 결론입니다.