✍️ 글쓰기/📕 읽고
#노마드북클럽 | 클린 코드 (Clean Code) 12일차
ddubimoon
2022. 3. 7. 15:35
TIL (DAY 12)
🔖 오늘 읽은 범위: 9장, 단위 테스트
책에서 기억하고 싶은 내용
- TDD 법칙 세 가지 (p155)
- 첫째 법칙: 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
- 둘째 법칙: 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
- 셋째 법칙: 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
- 깨끗한 테스트 코드 유지하기 (p156)
- 테스트 코드는 실제 코드 못지 않게 중요하다. ... 테스트 코드는 사고와 설계와 주의가 필요하다. 실제 코드 못지 않게 깨끗하게 짜야 한다. (p157)
- 테스트는 유연성, 유지보수성, 재사용성을 제공한다. (p157)
- 테스트 케이스가 없으면 실제 코드를 유연하게 만드는 버팀목도 사라진다. (p157)
- 실제 코드를 점검하는 자동화된 단위 테스트 슈트는 설계와 아키텍처를 최대한 깨끗하게 보존하는 열쇠다. (p157)
- 깨끗한 테스트 코드를 만들려면? 세 가지가 필요하다. 가독성, 가독성, 가독성. (p158)
- 숙련된 개발자라면 자기 코드를 좀 더 간결하고 표현력이 풍부한 코드로 리팩터링해야 마땅하다. (p161)
- 이중 표준
- 실제 환경에서는 절대로 안 되지만 테스트 환경에서는 전혀 문제없는 방식이 있다. 대개 메모리나 CPU 효율과 관련 있는 경우다. 코드의 깨끗함과는 철저히 무관하다. (p164)
- 가장 좋은 규칙은 "개념 당 assert 문 수를 최소로 줄여라"와 "테스트 함수 하나는 개념 하나만 테스트하라"라 하겠다. (p167)
- F.I.R.S.T (p167)
- Fast: 테스트는 빨리 돌아야 한다. 자주 돌려 초반에 문제를 찾아내 고쳐 코드 품질을 유지할 수 있다.
- Independent: 각 테스트는 서로 의존하면 안 된다. 한 테스트가 다음 테스트가 실행될 환경을 준비해서는 안 된다.
- Repeatable: 테스트는 어떤 환경에서도 반복 가능해야 한다. 테스트가 돌아가는 데 코드가 아닌 다른 원인이 개입하는 것을 지양해야 한다.
- Self-Validating: 테스트는 bool 값으로 결과를 내야 한다. 테스트가 스스로 성공과 실패를 가늠하지 않는다면 판단은 주관적이 되며 지루한 수작업 평가가 필요하게 된다.
- Timely: 테스트는 적시에 작성해야 한다. 단위 테스트는 테스트하려는 실제 코드를 구현하기 직전에 구현한다.
- 테스트 코드는 지속적으로 깨끗하게 관리하자. 표현력을 높이고 간결하게 정리하자. 테스트 API를 구현해 도메인 특화 언어(Domain Specific Language)를 만들자. (p168)
오늘 읽은 소감 및 생각
- 지저분한 테스트가 결국엔 테스트 코드 유지, 보수의 결함을, 그리고 그 결함이 코드 자체의 수정을 주저하게 만들고, 결국엔 망가지고 더러워지는 실제 코드. 프로그래밍이라는건 이만큼 첫 단추가 중요하고, 그만큼 유지보수하는 시간과 에너지도 중요한 작업이라는 걸 계속해서 느끼고 있다.
- 테스트 코드를 실제 코드를 구현하기 전에 작성해야 한다는 규칙이 인상적이었다. 코드를 짜면 짤수록, 도대체 어디에서부터 시작해야 효율적인 양질의 코드를 짤 수 있을지 고민이 많았다. 하지만 이렇게 테스트 코드부터 짜는 습관을 들이면, 알맞은 크기로 잘게 쪼개어진 코드를 어디서부터 시작해서 짜게 될지 쉽게 감을 잡을 수 있을 것 같다. 조만간 실제 코딩에 적용해봐야겠다.
궁금한 내용이나 새로 알게 된 개념
- BUILD-OPERATE-CHECK 패턴
: build - 테스트 데이터를 만드는 과정, operate - 테이터를 조작, 작동하는 과정, check - 데이터 조작의 결과를 확인하는 과정. (출처) - Given-When-Then 패턴
: given - 테스트에서 구체화하고자 하는 행동을 시작하기 전에 테스트 상태를 설명하는 부분, when - 구체화하고자 하는 그 행동, then - 어떤 특정한 행동 때문에 발생할거라고 예상되는 변화에 대한 설명 (출처) - Template Method 패턴
: 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴 (출처) - StringBuffer
: 자바에서 문자열을 추가하거나 변경할 때 주로 사용하는 자료형. (출처)