본 내용은 Unit Testing - 블라디미르 코리코프 도서를 읽고 정리한 내용입니다.
이번에는 다음을 공부하자
- 단위 테스트의 구조
- 단위 테스트 명명법
인프런의 김영한 개발자님이 소개해주신 패턴에 대해서 보자!
(책에서는 AAA 패턴을 자세히 소개한다.)
테스트를 3가지의 구절로 준비하자.
✅ 준비구절 : 테스트 대상 시스템과 해당 의존설을 원하는 상태로 만든다.
✅ 실행 구절 : SUT에서 메서드를 호출하고 준비된 의존성을 전달하며 출력 값을 캡처한다.
✅ 검증 구절 : 결과를 검증한다.
가령 다음과 같은 테스트는 피하도록 하자.
테스트 준비 -> 실행 -> 검증 -> 좀 더 실행 -> 다시 검증
이와 같은 상황이면 테스트를 나누어 해결하자.
준비, 실행, 검증 구절이 나타나는 것과 비슷하기, if 문이 있는 단위테스트는 테스트가 한 번에 너무 많은 것을 검증한다는 표시다.
각 구절마다 지침이 존재한다.
✅ 준비 구절이 가장 큰 경우 : 일반적으로 준비 구절이 세 구절 중 가장 크다. 다만, 엄청나게 큰 경우는 같은 테스트 클래스 내 비공개 메서드 또는 별도의 팩토리 클래스로 도출하는 것이 좋다.
✅ 실행 구절이 한 줄 이상인 경우 경계하라 : 실행 구절은 보통 코드 한 줄이다.
✅ 단일 동작 단위는 여러 결과를 낼 수 있으며, 하나의 테스트로 그 모든 결과를 평가하는 것이 좋다. 하지만 검증 구절이 너무 커지는 것은 경계해야 한다.
테스트에 표현력이 있는 이름을 붙이는 것은 중요하다. 올바른 명칭은 테스트가 검증하는 내용과 기본 시스템의 동작을 이해하는 데 도움이 된다.
❗️ 기존에 존재하는 [테스트 대상 메서드]_[시나리오]_[예상 결과]로 짓는 것은 동작 대신 구현 세부 사항에 집중하게끔 부추기기 때문에 분명히 도움이 되지 않는다.
ex) Sum_TwoNumbers_ReturnsSum
✅ 해답은 간단한 문구로 고객이나 도메인 전문가에게 의미 있는 방식으로 시스템 동작을 설명할 수 있어야 한다.
ex) Sum_of_two_numbers
두 예시로 보면 언뜻 위의 예가 좋아 보인다. 하지만 실제로 가독성에 좋은가? 전혀 아니다.