일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- System.in
- 스파르타코딩클럽
- 항해99
- 함수형 인터페이스
- Study Halle
- 접근지시자
- 제네릭 와일드 카드
- yield
- 합병 정렬
- Switch Expressions
- System.out
- auto.create.topics.enable
- 프리미티브 타입
- annotation processor
- System.err
- 람다식
- 상속
- 제네릭 타입
- 브릿지 메소드
- docker
- raw 타입
- 바운디드 타입
- 자바할래
- junit 5
- 익명 클래스
- 정렬
- 자바스터디
- 로컬 클래스
- github api
- throwable
Archives
- Today
- Total
코딩하는 털보
클린 코드, 9. 단위 테스트 본문
클린 코드, 9. 단위 테스트
애자일과 TDD 덕택에 단위 테스트를 자동화하는 프로그래머들이 많아졌으며 점점 더 늘어나는 추세다. 하지만 테스트를 추가하려고 급하게 서두르는 와중에 많은 프로그래머들이 제대로 된 테스트 케이스를 작성해야 한다는 중요한 사실을 놓치고있다.
TDD 법칙 세 가지
- 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
- 둘째 법칙 : 컴파일은 잘 돼면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
- 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
이렇게 일하면 실제 코드를 사실상 전부 테스트하는 많은 테스트 케이스가 나온다. 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리문제를 유발하기도 한다.
깨끗한 테스트 코드 유지하기
테스트 코드는 실제 코드 못지 않게 중요하다. 실제 코드 못지 않게 깨끗하게 짜야 한다.
테스트는 유연성, 유지보수성, 재사용성을 제공한다. 특히 테스트 케이스가 깨끗하고 커버리지가 높을수록 그렇다.깨끗한 테스트 코드
깨끗한 테스트 코드 = 가독성이 좋은 테스트 코드, 테스트 코드는 최소의 표현으로 많은 것을 나타내야 한다.- BUILD-OPERATE-CHECK 패턴 : 테스트 자료를 만들고 조작하고 결과를 확인하는 세 부분으로 테스트 코드 나누어 가독성을 높여준다.
- DSL : 도메인에 특화된 언어. 테스트 코드 작성 시 잡다하고 세세한 테스트 구현 코드를 숨기는 DSL을 만들어 테스트 코드 가독성을 향상 시킬 수 있다.
테스트 당 assert 하나
테스트 케이스 메서드마다 assert 문을 단 하나만 사용하면 결론이 하나라서 가독성이 좋아진다.
여러 aseert 문을 하나로 병합하기 불합리하다면 여러개의 테스트로 나눈다. 하지만 테스트를 분리하면 중복은 많아진다.- TEMPLATE METHOD 패턴 : 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴, 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
given-when-then 에서 given/when 부분을 부모 클래스에 두고 then 부분을 자식 클래스에 두면 된다. - 또는 새로운 테스트 클래스에서 given/when 부분을 @Before에 두고 then 부분을 @Test에 두면 된다.
- 두 방법 모두 가능은 하지만 배보다 배꼽이 더 큰 느낌이 있다. 테스트 당 assert 문을 하나로 강제하기 보다는 assert 문 개수를 최대한 줄이려고 노력하자.
- 결과적으로 하나의 테스트 메서드는 하나의 개념만 테스트하고 하나의 개념 당 assert 문 수를 최소로 줄여야 한다.
- TEMPLATE METHOD 패턴 : 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴, 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
FIRST
- Fast : 테스트는 자주 돌릴 수 있을 정도로 빨라야 한다.
- Independent : 각 테스트는 서로 의존해서는 안된다.
- Repeatable : 테스트는 어떤 환경에서도 반복 가능해야 한다.
- Self-Validating : 테스트가 스스로 성공과 실패를 가늠하여 결과를 내야한다. 다른 수작업이 없어야 한다.
- Timely : 테스트는 적시에 작성해야 한다. 단위 테스트는 실제 코드를 구현하기 직전에 구현한다.
Comments