Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
TIL 8장(경계),9장(단위 테스트)
#clean_code
2년 전
546

TIL (Today I Learned) 날짜

2022. 03. 06

오늘 읽은 범위

8장 경계

9장 단위 테스트

책에서 기억하고 싶은 내용을 써보세요.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

8장 경계

  • 외부 코드 사용하기

경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의한다.

  • 경계 살피고 익히기

외부 코드를 익히기도 통합하기도 어렵다. 두 가지를 동시에 하기는 두 배나 어렵다. 다르게 접근해서 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성하는 것은 어떤가? 짐 뉴커크는 이를 학습 테스트라 부른다.

log4j익히기

  • 학습 테스트는 공짜 이상이다

패키지 새 버전이 나온다면 학습 테스트를 돌려 차이가 있는지 확인한다. 학습 테스트는 패키지가 예상대로 도는지 검증한다.새 버전이 우리 코드와 호환되지 않으면 학습 테스트가 이 사실을 곧바로 확인한다. 실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스가 있다면 패키지 새 버전으로 이전하기 쉬워진다.

아직 존재하지 않는 코드를 사용하기

  • 깨끗한 경계

경계에 위치하는 코드는 깔끔히 분리한다. 또한 기대치를 정의하는 테스트 케이스도 작성한다. 통제 불가능한 외부 패키지에 의존하는 대신 통제 가능한 우리 코드에 의존 하는 것이 좋다. 외부 패키지를 최대한 줄이고 새로운 클래스로 경계를 감싸거나 ADAPTER 패턴을 사용해 우리가 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환하자.

9장 단위 테스트

  • TDD 법칙 세 가지

첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.

둘째 법칙 : 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.

셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.

위 세가지 규칙을 따르면 개발과 테스트가 대략 30초 주기로 묶인다. 이렇게 일하면 실제 코드를 전부 테스트하는 테스트 케이스가 나온다. 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리 문제를 유발하기도 한다.

  • 깨끗한 테스트 코드 유지하기

테스트는 유연성, 유지보수성, 재사용성을 제공한다.

  • 깨끗한 테스트 코드

깨끗한 테스트 코드를 만들려면 세 가지가 필요하다. 가독성, 가독성, 가독성. 가독성을 높이려면 여느 코드처럼 명료성, 단순성, 풍부한 표현력이 필요하다.

- 도메인에 특화된 테스트 언어

- 이중 표준

  • 테스트당 assert 하나

assert문이 단 하나인 함수는 결론이 하나라서 코드를 이해하기 쉽고 빠르다.

  • 테스트당 개념 하나

새 개념을 한 함수로 몰아넣으면 독자가 각 절이 거기에 존재하는 이유와 각 절이 테스트하는 개념을 모두 이해해야한다.

가장 좋은 규칙은 "개념 당 assert 문 수를 최소로 줄여라"와 "테스트 함수 하나는 개념 하나만 테스트하라"라 하겠다.

  • F.I.R.S.T - 깨끗한 테스트의 다섯가지 규칙

1. 빠르게(Fast) : 테스트가 느리면 자주 돌릴 엄두를 못 낸다. 자주 돌리지 않으면 초반에 문제를 찾아내 고치지 못한다.

2. 독립적으로(Independent) : 각 테스트는 서로 의존하면 안 된다. 한 테스트가 다음 테스트가 실행 될 환경을 준비해서는 안 된다. 독립적으로 그리고 어떤 순서로 실행해도 괜찮아야 한다.

3. 반복가능하게(Repeatable) : 테스트는 실제 환경, QA환경, 네트워크에 미연결된 노트북 어떤 환경에도 반복 가능해야 한다.

4. 자가검증하는(Self-Validating) : 테스트는 부울값으로 결과를 내야 한다. 테스트가 스스로 성공과 실패를 가늠하지 않는다면 판단은 주관적이 되며 지루한 수작업 평가가 필요하게 된다.

5. 적시에(Timely) : 테스트는 적시에 작성해야 한다. 단위 테스트는 실제 코드를 구현하기 직전에 구현한다.