
① 한 문단에 한 주제
② 완벽하게 제어하기
③ 테스트 환경의 독립성을 보장하자.
④ 테스트 간 독립성을 보장하자.
⑤ 한 눈에 들어오는 Test Fixture 구성하기
⑥ Test Fixture 클렌징
⑦ 테스트 수행도 비용이다. 환경 통합하기
⑧ private 메서드의 테스트
⑨ 테스트에서 필요한 메서드가 생겼는데 프로덕션 코드에서는 필요 없는 경우
② 완벽하게 제어하기
given 절에서 데이터를 만들 때, (수행할 때 마다 or 수행되는 환경이 달라질 때 마다) 테스트 결과가 달라질 수 있는 LocalDateTime.now() 와 같은 것은 되도록 사용을 지양하자.LocalDateTime.now() 와 같이 사용하기 보다는, 고정된 날짜와 고정된 시간, 고정된 값 등으로 넣어주는게 좋다. (제어할 수 없는 값들을 제어할 수 있는 값으로 만들자.)LocalDateTime.now() 으로 아무생각 없이 쓰기 시작하면 모든 사람들 또한 같이 쓰기 시작하면서 프로젝트 내에서 번지게 된다.LocalDateTime.now() 같이 현재시간이라는 제어할 수 없는 변수를 사용했을 때, 나중에 변경사항이 생기는 경우, 문제를 일으킬 수 있다. ( 수행되는 환경에 따라 시간이 달라져서 문제가 발생한다던지 등 )Mocking 처리하자.
③ 테스트 환경의 독립성을 보장하자.
given 절을 조성할 때 최대한 독립성을 보장하도록 구성하자.
stock1.deductQuantity(3); 에서 내부 로직을 파악하고 맥락을 이해해야만 하는 허들이 생긴다.deductQuantity() 내부에서 뭔가 로직이 있어서, 예외를 발생시키는 구문이 있다고 가정해보자. 그러면 테스트에서 when/then 절에서 테스트가 실패하는게 아니라, given 절에서 테스트에 실패하게 된다. 즉, 테스트 주제와 맞지않는 부분에서 테스트가 실패하는 것이다. ( 이렇게 되면, 만약 단순한 테스트 케이스가 아닌 복잡한 테스트 상황에서 테스트가 실패한 경우, 이게 왜 실패했는지 유추하기 어렵게 만드는 포인트가 될 수 있다. )

④ 테스트 간 독립성을 보장하자.
@DynamicTest 를 사용하면 된다.
✔️ 참고 - @DynamicTest ( 상태 공유가 필요한 일련의 단계적 시나리오 작성이 필요한 경우 )

강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 박우빈 강사님께 있습니다.