April 27, 2019
안정감과 자신감!😌
현재와 미래의 나! 현재와 미래의 동료를 위해!
로또를 구현하라
구현 vs 설계 구현은 언젠가 어떻게든 변할 수 있다. 그렇기 때문에, 설계를 기준으로 테스트코드를 짜야 한다.
구현을 테스트하는 게 아니라, 설계를 테스트해야 한다. (중복되지 않은 숫자도 테스트 해야지!)
Non-Testable!
외부세계
제어할 수 없는 영역은 멱등한 결과를 보장할 수 없다. (랜덤하게 반환) 그럼
랜덤하게 반환이 아니라, 의도한 전략대로 반환! 이라고 재정의
항상 성공할 수 있는 것, 항상 동일한 결과가 나올 수 있는 것을 테스트
테스트할 수 없는 영역을 어떻게?
테스트할 수 없는 영역이 method call tree 하위에 있을 때, 이를 분리해서 끌어올려야 함(boundary layer까지).
현재 시간에 해당하는 할인 금액 합산 -> 특정 시간에 해당하는 할인 금액 합산
boundary layer는 한 모듈로서의 의미를 지니는 가장 바깥 쪽!
테스트 불가능한 영역을 boundary Layer로 올려서 테스트 가능하도록 변경
@Autowired
private ShuffleStrategy shuffleStrategy;
Java에서 이 필드의 의미는? Nullable
Spring Context의 오용은 언어의 본질을 망각할 수 있다.
Context, Framework 에 의존적이지 않은 테스트를 하자.
Test Double을 사용하는 것은 테스트가 구현을 알아야 한다는 것이다. (테스트 더블이 아마 어떤 고정값을 리턴하게 해서 신경쓰지 않게 해놓는 것 같음)
Boundary Context까지 끌어올려진 Non-Testable한 것만 Test Double처리
순수 자바 어플리케이션으로는 테스트할 수 없는 것
외부 API
Embedded 사용!
테스트 정확도 Local > Embedded 테스트 피드백 속도 Local < Embedded 테스트 안정성 Local < Embedded
Spring Framework Test
테스트의 목적은 요청과 응답 스펙 검증만으로 제한하는 게 정신 건강에 좋을 것이라고 생각! 요청 -> @Controller -> @MockBean -> 응답
by 이호진 - 우아한형제들 기술블로그
by 배달의민족 권용근