Junuuu 2023. 6. 29. 00:01

4장에서 다루는 내용

  • 좋은 단위 테스트의 관점 간 차이점 모색
  • 이상적인 테스트 정의
  • 테스트 피라미드 이해
  • 블락박스 테스트 및 화이트박스 테스트 사용

 

좋은 테스트의 4가지 요소

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

 

회귀 방지

소프트웨어의 버그로 코드를 수정한 후 기능이 의도한 대로 작동하지 않는 경우입니다.

회귀는 귀찮으며, 개발할 기능이 많을수록 새로운 릴리스에서 기능이 하나라도 고장 날 가능성이 높습니다.

 

테스트 중 실행되는 코드의 양은 많아야 하며, 복잡도, 도메인 유의성도 중요합니다.

복잡한 비즈니스 로직을 나타내는 코드가 보일러플레이트 코드보다 훨씬 더 중요합니다.

중요한 기능에서 발생한 버그가 가장 큰 피해를 입히기 때문입니다.

 

리팩터링 내성

테스트를 빨간색(실패)으로 바꾸지 않고 기본 애플리케이션 코드를 리팩터링 할 수 있어야 합니다.

코드를 리팩터링하였고 기능은 정상동작하였지만 테스트가 실패할 수 있습니다.

이런 경우는 거짓 양성이라고 하며 허위 경보입니다.

이러한 작업이 반복되면 테스트에 대한 신뢰도가 서서히 떨어지며, 리팩터링이 줄어들게 됩니다.

 

거짓 양성의 원인은 무엇인가?

대부분 테스트와 테스트 대상 시스템의 구현 세부사항이 많이 결합할수록 허위 경보가 더 많이 생깁니다.

한마디로 최종 사용자에게 의미 있는 결과만 확인해야 합니다.

 

예를 들어 HTML을 표현하며 Header, Body, Footer를 생성하고 이를 랜더링 하여 HTML 문서로 만드는 클래스가 있다고 가정하였을 때 header, body, footer의 순서의 여부를 확인하는 테스트를 작성한다면 랜더링 클래스를 재배열하거나 하나를 새것으로 교체했을 때 버그로 이어지지 않지만, 테스트는 깨지게 됩니다.

 

이런 원인을 제거하기 위해서는 구현세부사항과 테스트 간의 결합도를 낮추어야 합니다.

한다디로 테스트는 HTML을 그리는 클래스를 블랙박스로 취급하고 식별할 수 있는 동작에만 신경 써야 합니다.

 

예를 들자면 header = h, body = b, footer =f를 넣었을 때 다음과 같은 string이 출력되어야 합니다.

내부는 블랙박스여서 어떤것이든 상관없습니다.

<h1>h</h1><b>b</b><i>f</i>

 

이제 SUT의 변경 사항은 테스트에 영향을 미치지 않으며 리팩터링 내성이 생겼습니다.

 

빠른 피드백과 유지보수성

빠른 피드백은 단위 테스트의 필수 속성입니다.

피드백이 빠를수록 더 많은 테스트를 수행하고, 더 자주 수행할 수 있습니다.

오래 걸리는 테스트는 자주 실행하지 못하기 때문에 잘못된 방향으로 가면서 시간을 더 많이 낭비하게 됩니다.

 

유지보수성은 두 가지 요소로 구성됩니다.

  • 테스트가 얼마나 이해하기 어려운가?
  • 테스트가 얼마나 실행하기 어려운가?

이해하기 쉬우려면 테스트 코드 라인이 적어야 하며 품질은 제품 코드만큼 중요해야 합니다.

또한 데이터베이스 서버 재부팅, 네트워크 연결 등으로 테스트가 실행하기 어려우면 안 됩니다.

 

이상적인 테스트는 존재하는가

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

 

예를 들어 E2E 테스트는 많은 코드를 테스트하여 회귀 방지를 훌륭하게 수행하고, 최종 사용자의 관점에서 기능이 어떻게 동작하는지 확인하기 때문에 리팩터링 내성에도 우수합니다.

단, 빠른 피드백은 불가능합니다.

 

예를들어 매우 간단한 객체 생성 테스트는 E2E와 다르게 매우 빠른 피드백을 주지만 코드에 실수한 여지가 많지 않기 때문에 회귀방지가 없습니다.

 

예를들어 깨지기 쉬운 테스트인 데이터베이스 쿼리를 테스트할 수 있습니다.

하지만 이 테스트의 경우에는 리팩터링 내성은 좋지 않습니다.

SQL문을 여러 형태로 변형해도 결과는 모두 같을 수 있습니다.

 

결론으로는 세 가지 특성 모두 완벽한 점수를 얻어 이상적인 테스트를 만드는 것은 불가능합니다.

보통 리팩터링 내성을 최대화하며 회귀 방지와 빠른 피드백사이에서 줄다리기를 하며 E2E 테스트, 통합 테스트, 단위 테스트의 비율로 작성합니다.

 

블랙박스와 화이트박스 테스트

블랙박스 테스트를 항상 기본적으로 적용합니다.

화이트박스 테스트는 깨지시 쉬우며 리팩터링 내성이 없습니다.

화이트박스 테스트는 테스트를 분석할 때 효과적으로 사용됩니다.