테스트코드/개요

4. 좋은 단위 테스트의 4대 요소

feel2 2024. 3. 25. 20:05
반응형

좋은 단위 테스트에는 다음 4가지 특성이 있음

- 회귀 방지
- 리팩토링 내성
- 빠른 피트백
- 유지 보수성

 

회귀 방지

 

코드를 수정한 후, 기능이 의도한 대로 작동하지 않는 경우를 말함

→ 즉, 코드 수정 후 버그가 있는데도 테스트가 통과되면 안된다.

회귀를 방지하려면 다음 사항을 고려해 봐야 한다.

  • 테스트 중에 실행되는 코드의 양
  • 코드 복잡도
  • 코드의 도메인 유의성

일반적으로 실행되는 코드가 많을수록 회귀가 나타날 가능성이 높음

회귀방지를 극대화하려면 테스트가 가능한 많은 코드를 실행하는 것을 목표로 해야 한다.

 

리팩토링 내성

 

테스트를 실패로 바꾸지 않고 기본 애플리케이션 코드를 리팩토링할 수 있는지에 대한 척도

→ ex) 메서드 이름을 바꾸거나, 코드 조각을 새로운 클래스로 추출하기

  • 거짓 양성
    • 리팩토링으로 기능은 예전과 똑같이 작동하지만 테스트는 실패로 바뀌는 것.

거짓 양성이 적을수록(리팩터링 내성이 높을수록) 좋은 테스트다.

거짓 양성을 줄이려면?

  • 리팩토링 내성을 높이려면 SUT의 구현 세부사항과 테스트 간의 결합도를 낮추면 된다.
    • 이는 해당 구현 세부 사항에서 테스트를 분리하는 것을 말함.

 

위 그림을 보면 왼쪽은 SUT를 블랙박스로 취급하고, 식별할 수 있는 동작만 신경쓰고 있다.

테스트 정확도 지표는 다음 두가지로 구성 됨

  • 테스트가 얼마나 버그 있음을 잘 나타내는가(거짓 음성(False negatives))
  • 테스트가 얼마나 버그 없음을 잘 나타내는가(거짓 양성(False positives))

 

 

테스트 정확도 = 신호(발견된 버그 수)/소음(허위 경보 발생 수)

 

프로젝트가 성장함에 따라 거짓 양성(False positives)은 테스트 스위트에 점점 더 큰 영향을 미치게 된다.

→ 결과적으로, 정기적으로 리팩토링을 진행해줘서 거짓 양성을 낮춰야(리팩토링 내성을 높여야) 한다.

 

테스트 스위트(Test Suite)

  • 특정 테스트 주기에서 실행해야 하는 테스트 케이스(또는 테스트 스크립트)의 집합이나 테스트 절차
  • 테스트 실행 목적에 따라 그룹화된 테스트 케이스의 집합
  • 실행 환경에 따라 구분해 놓은 테스트 케이스의 집합
  • 각 테스트 케이스가 시나리오를 포함하고 있는 경우에 테스트 스위트를 이용한다
  • 테스트 스위트 내 하나의 테스트 케이스가 성공적으로 끝나야 다음 테스트 케이스로 넘어간다
  • 테스트 스위트가 유용하게 쓰이는 테스트 유형 = 빌드 검증 테스트, 스모크 테스트, E2E 테스트, 기능성 검증 테스트, 리그레션 테스트
  • 자동화 리그레션 테스트 케이스 집합 또는 end-to-end 시나리오로 구성된 테스트 케이스 집합을 연속적으로 실행 가능

예) 테스트 스위트 (각 테스트 케이스는 테스트 스크립트를 포함)

  • 테스트 케이스 1: 로그인
  • 테스트 케이스 2: 새로운 제품 추가
  • 테스트 케이스 3: 체크아웃
  • 테스트 케이스 4: 로그아웃
테스트 스크립트 < 테스트 케이스 < 테스트 스위트

 

빠른 피드백과 유지 보수성

 

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

  • 테스트 속도가 빠를수록, 스위트에서 더 많은 테스트를 수행 가능

유지 보수성 지표는 유지비를 평가한다.

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

 

좋은 단위 테스트를 작성하는 방법

 

좋은 단위 테스트는 처음 세가지(회귀 방지, 리팩토링 내성, 빠른 피드백)은 상호 배타적이다.

  • 세가지 모두 최대로 하는 것은 불가능
  • 셋 중 하나를 희생해야 나머지 둘을 최대로 유지 가능하다.

리팩토링 내성을 최대한 많이 갖는 것을 목표로 해야 한다. 따라서 테스트가 얼마나 버그를 잘 찾는지(회귀 방지)와 얼마나 빠른지(빠른 피드백) 사이에 선택으로 절충된다.

 

블랙박스 테스트와 화이트박스 테스트 간의 선택

  • 블랙박스 테스트
    • 시스템의 내부 구조를 몰라도 시스템 기능을 검사하는 것
    • 일반적으로 명세와 요구 사항, 애플리케이션이 무엇을 해야 하는지를 중심으로 구축
  • 화이트박스 테스트
    • 애플리케이션 내부 작업을 검증
    • 소스 코드를 검사

회귀 방지 리팩토링 내성

화이트박스 테스트 좋음 나쁨
블랙박스 테스트 나쁨 좋음

 

리팩토링 내성이 좋은 블랙박스 테스트를 기본 전략으로 선택해야 한다.

 

참조

  • 단위테스트(블라디미르 크리코프)
반응형

'테스트코드 > 개요' 카테고리의 다른 글

6. 단위 테스트 스타일  (0) 2024.03.25
5. 목과 테스트의 취약성  (0) 2024.03.25
3. 단위 테스트 구조  (0) 2024.03.25
2. 단위 테스트란 무엇인가  (1) 2024.03.25
1. 단위 테스트의 목표  (1) 2024.03.25