Yunseok's Dev Blog

배운 것을 적는 블로그입니다.

자바와 JUnit을 활용한 실용주의 단위 테스트 서평

테스트는 우리의 관심사를 확실히 드러내야 한다. 그러려면 부가적인 것들은 가려서 안 보이게 해야 한다. 코드가 읽기 어렵다면 코드의 의도를 파악하기 어려워진다. 테스트 또한 우리가 유지 보수해야 하는 또 다른 코드이기 때문에 신중하게 작성해야 하고 지속적으로 리팩토링을 해야 한다.

테스트를 작성할 때는 동작에 집중해야 하지 구현을 테스트하면 안 된다. 변화에 더 집중하여 어떤 동작을 왜 하고 했다면 어떤 일이 벌어지는가에 대해 더 집중해야 한다. 그래서 결국 가장 중요한 것은 의도다. 그런데 만약 내부 행위를 테스트하려는 충동이 든다면 설계에 문제가 있는 것이다. 나도 이러한 경험이 있다. 테스트 코드와 실제 테스트하려는 코드와 거의 일치했던 적이 있다. 이런 것보다는 변화에 집중하여 해당 코드를 실행했을 때 어떤 변화가 일어날지를 테스트하는 게 더 좋다.

우리가 작성한 코드는 동작하는, 실행할 수 있는 문서 역할을 한다.

좋은 테스트는

  • 빠르다. 너무 느리면 피드백을 빠르게 얻지 못한다.
  • 어떤 순서나 시간에 관계없이 실행할 수 있다. 그러려면 테스트끼리 의존성이 없어야 하고 각각 실행 가능해야 한다.
  • 반복 가능하다. 통제할 수 없는 외부 환경에 있는 항목들과 격리시켜서 반복 가능한 테스트를 만들어야 한다.
  • 스스로 검증 가능하다. 스스로 검증뿐만 아니라 준비까지도 자동으로 되어야 한다.
  • 적시에 실행된다. 가능하면 적절한 순간에 단위 테스트에 집중하는 것이 낫다.

무엇을 테스트할 것인가?

  • 코드가 정상적으로 동작한다면 그것을 알 수 있을까?
  • 경계조건은 맞을까? 입력 값의 양극단을 다루는 경계 조건에 주의해야 한다. 유효하지 않은 값을 넣어서 어떻게 동작하는지 확인해야 한다.
    • Conformance(준수) 값이 기대한 양식을 준수하고 있는가?
    • Ordering(순서) 값의 집합이 적절하게 정렬되거나 정렬되지 않았나?
    • Range(범위) 이성적인 최솟값과 최댓값 안에 있는가?
    • Reference(참조) 코드 자체에서 통제할 수 없는 어떤 외부 참조를 포함하고 있는가?
    • Existence(존재) 값이 존재하는가
    • Cardijality(기수) 정확히 충분한 값들이 있는가?
    • Time(절대적 혹은 상대적 시간) 모든 것이 순서대로 일어나는가? 정확한 시간에 일어나는가?
  • 역 관계를 검사할 수 있는가? 논리적인 역 관계를 적용해 행동을 검사할 수 있다.
  • 다른 수단을 활용하여 교차검사할 수 있는가? 내가 선택한 해법이 올바른지 검사할 수 있는 다른 해법이 있는가?
  • 오류 조건을 강제로 일어나게 할 수 있는가? 예상치 못한 문제들을 강제로 일어나게 하여 어떻게 대응할 것인지를 결정해야 한다.
  • 성능 조건은 기준에 부합하는가?

목 객체를 사용하여 테스트하기 쉽게 만들고 의존성을 격리시키는 줄만 알았는데 입력한 값이 모두 정상인지를 여부를 검증하는 일도 한다는 것을 처음 알게 되었다.

이 모든 것들이 나만 실천하기보다는 다른 팀원들과 같이 실천하는 게 가장 좋은 것 같다. 팀원들이 이해하지 못한다면 더 안 좋은 코드가 생길 수 있을 것 같다. 짝 프로그래밍을 통해 다른 사람들과 지식을 나누고 빠른 피드백을 통해 더 좋은 코드를 만드는 것이 사후 처리보다 훨씬 시간과 비용이 적게 드는 것 같다.

액션

  • TDD를 더 연습하자. 충분히 연습되어 있지 않았다 보니 코딩 시험을 볼 때 당황하고 원칙을 어겼다.
  • 테스트를 작성할 때 좋은 테스트의 조건을 부합하는지 잘 확인하자.

좋았던 점

  • 책의 말투가 굉장히 친절한 말투다. 젠틀한 느낌이 든다.
  • 난이도가 적당하다. 너무 어려운 말도 없고 이해하기 어려운 부분도 없다. 나쁘게 보면 깊은 내용이 없는 것인데 절제된 느낌이라 좋았다.

아쉬웠던 점

  • 에디터처럼 예제 코드에 색깔이 없어서 읽기 어려웠다. 다른 부분은 컬런데 코드에는 색이 없어서 가독성이 떨어졌다. 개발 책 중에 에디터처럼 색깔이 들어간 책을 못 본 것 같은데 왜 그럴까 궁금해졌다.
  • 코드를 따라치지 못해 아쉽다.

Sources