본문 바로가기

독서찰기(讀書札記)/단위 테스트

이상적인 테스트를 찾아서

회귀 방지, 리팩터링 내성, 빠른 피드백, 유지 보수성

위 네 가지 특성의 수학적 곱이 클수록 이상적인 테스트이다. (하나라도 0이 되면 전체가 0이 된다)

각각의 특성에 상당히 높은 임계치를 설정하고 이 임계치를 충족하는 테스트만 테스트 스위트에 남겨라.

이상적인 테스트를 만들 수 있는가?

회귀 방지, 리팩터링 내성, 빠른 피드백. 이 세 가지 특성은 상호 배타적이다.

따라서 특성 중 어느 것도 크게 줄지 않는 방식으로 최대한 크게 해야한다.

 

한 가지를 아예 희생시켜, 결국 가치가 0에 가까워진 테스트 사례를 살펴보자.

극단적인 사례 1: 엔드 투 엔드 테스트

엔드 투 엔드 테스트는 많은 코드를 테스트하므로 회귀 방지를 훌륭히 해낸다.

또한 엔드 투 엔드 테스트는 거짓 양성에 면역이 돼 리팩터링 내성도 우수하다.

하지만 느린 속도로 인해 빠르게 피드백을 받아볼 수 없다.

극단적인 사례 2: 간단한 테스트(trivial test)

간단한 테스트는 매우 빠르게 실행되고 빠른 피드백을 제공한다.

또한 거짓 양성이 생길 가능성이 상당히 낮기 때문에 리팩터링 내성도 우수하다.

하지만 기반 코드에 버그가 생길 여지가 거의 없기 때문에 방지할 회귀가 없게 된다.

극단적인 사례 3: 깨지기 쉬운 테스트(brittle test)

e.g.) UserRepository에서 findById를 했을 때 올바른 SQL을 생성하는지 검증하는 테스트

실행이 빠르고 회귀를 잡을 가능성이 높다.

하지만 거짓 양성이 많은 테스트일 가능성이 높다.

SQL문이 조금씩 달라져도 원하는 결과를 얻을 수 있기 때문이다. (이는 SUT의 내부 구현 세부 사항과 결합되어 있음을 뜻한다)

이상적인 테스트를 찾아서: 결론

최상의 테스트는 유지 보수성과 리팩터링 내성을 최대로 갖기 때문에 항상 이 두 특성을 최대화하도록 노력해야 한다.

따라서 회귀 방지와 빠른 피드백 사이의 선택으로 절충이 귀결된다.

 

팁: 테스트 스위트를 탄탄하게 만들려면 테스트의 불안정성(거짓 양성)을 제거하는 것이 최우선 과제다.