단위 테스트는 함수나 작은 모듈처럼 제한된 범위의 동작을 입력과 기대 결과로 확인하는 자동 검사다. 오류가 생겼을 때 원인을 좁히기 쉽도록 빠르고 독립적으로 실행하는 것이 유용하다. Python의 unittest는 테스트 사례, 준비와 정리, 실행기와 테스트 모음을 제공한다. Python 공식 문서
행동을 확인하는 구성
테스트는 필요한 입력을 준비하고 대상 기능을 실행한 뒤 결과를 검증한다. 내부 함수가 몇 번 호출됐는지보다 사용자가 기대하는 반환값이나 오류를 확인하는 편이 구현 변경에 덜 민감할 수 있다. 시간이나 네트워크처럼 변동되는 의존성은 제어 가능한 형태로 분리하되, 대체 객체가 실제 계약과 달라지지 않도록 주의한다. Python에서는 unittest.mock으로 의존 대상을 바꾸거나 호출 결과를 제어할 수 있다.
할인 계산 예시
금액과 할인율을 받아 최종 금액을 반환하는 함수를 생각해 보자. 정상 사례만 검사하면 음수 입력이나 반올림 규칙을 놓칠 수 있다.
| 입력 상황 | 확인할 내용 |
|---|---|
| 할인율 0 | 원래 금액 유지 |
| 할인율 100 | 규칙상 최종 금액 0 |
| 허용 범위 밖 할인율 | 정해진 오류 반환 |
| 소수 계산 발생 | 합의한 반올림 규칙 적용 |
이 표의 조건은 예시이며 실제 서비스의 가격 정책으로 확정한 뒤 기대값을 작성해야 한다. 잘못된 기대값을 가진 테스트는 오류를 오히려 고정할 수 있다.
범위와 한계
각 테스트는 실행 순서에 의존하지 않아야 한다. 공유 상태를 바꿨다면 정리하고, 실패 메시지에는 어떤 조건이 어긋났는지 드러나게 한다. CI에서 반복 실행하면 이후 변경이 기존 동작을 깨뜨렸는지 확인하는 데 도움이 된다.
단위 테스트가 모두 통과해도 데이터베이스 연결이나 실제 브라우저 흐름이 정상이라는 뜻은 아니다. 여러 구성 요소가 만나는 부분은 통합 테스트, 사용자의 전체 작업은 E2E 테스트로 보완한다. 검사 개수나 실행률만으로 제품 품질을 판단하지 않는다.