좋은 테스트란 무엇인가
단위테스트 (블라디미르 코리코프)
단위 테스트, 통합 테스트, 엔드 투 엔드 테스트 등 자동화 된 테스트를 분석하는 데 사용할 수 있는 네 가지 기본 특성이 있다.
- 회귀 방지
- 리팩터링 내성
- 빠른 피드백
- 유지 보수성
회귀 방지
회귀 : 코드를 수정한 후 기능이 의도한 대로 작동하지 않는 경우. (= 소프트웨어 버그)
회귀 방지는 테스트가 얼마나 버그(회귀)의 존재를 잘 나타내는지에 대한 척도이다. 테스트가 코드를 더 많이 실행할수록 (여러분의 코드와 프로젝트에서 사용한 라이브러리 및 프레임워크 코드 모두) 테스트에서 버그가 드러날 확률이 더 높아진다.
리팩터링 내성
리팩터링 내성은 테스트가 거짓 양성을 내지 않고 애플리케이션 코드 리팩터링을 유지할 수 있는 정도를 의미한다.
거짓 양성 : 테스트가 실패했다고 나오지만 그 기능은 의도한 대로 작동하는 것
거짓 음성 : 알려지지 않은 버그
빠른 피드백
빠른 피드백은 테스트가 얼마나 빨리 실행되는지에 대한 척도이다.
유지 보수성
유지 보수성은 두 가지 요소로 구성된다.
- 테스트 이해 난이도
테스트가 작을수록 읽기 쉽다. - 테스트 실행 난이도
테스트에 관련된 프로세스 외부 의존성은 적을수록 쉽게 운영할 수 있다.
회귀방지와 리팩터링 내성이 가지는 의의
회귀 방지와 리팩터링 내성은 테스트 정확도에 기여한다. 테스트는 가능한 한(리팩터링 내성 영역) 적은 소음(거짓 양성)으로 강한 신호(버그를 찾을 수 있음, 회귀 방지 영역)를 발생시키기 때문에 정확하다.
좋은 테스트란 무엇인가.
수학적으로 4가지 요소에 각각 0~1 사이의 점수를 준다고 하였을 때 테스트의 점수는 다음과 같이 나타낼 수 있을 것이다.
테스트 점수 = 회귀 방지(0~1) * 리팩터링 내성(0~1) * 빠른 피드백(0~1) * 유지 보수성(0~1)
여기서 회귀 방지, 리팩터링 내성, 빠른 피드백은 서로 배타적인 성격이 있기 때문에 일반적으로 3가지 모두 충족하기는 어렵다. 따라서 모든 특성에서 최대 점수를 받는 것은 불가능 하다.
그러면 여기서 선택이 필요한데 리팩터링 내성은 타협할 수 없다. (일반적으로 0 또는 1이기 때문.)
따라서 회귀 방지와 빠른 피드백 사이의 선택으로 절충이 귀결된다.
엔드 투 엔드 테스트는 회귀 방지를 선호하는 데 반해, 단위 테스트는 빠른 피드백을 선호한다. 통합 테스트는 그 중간에 있다.
블랙박스 테스트와 화이트박스 테스트
블랙박스 테스트
시스템의 내부 구조를 몰라도 시스템의 기능을 검사할 수 있는 소프트웨어 테스트 방법
화이트박스 테스트
애플리케이션의 내부 작업을 검증하는 테스트 방식
테스트를 작성할때는 블랙박스 테스트 방법을 사용하라.
(위에서 언급된 대로 리팩터링 내성은 타협할 수 없다.)
테스트를 분석할 때는 화이트박스 테스트 방법을 사용하라.