4.1 좋은 단위 테스트의 4대 요소 자세히 살펴보기
- 회귀 방지
- 리팩터링 내성
- 빠른 피드백
- 유지 보수성
4.1.1 첫 번째 요소: 회귀방지
회귀는 소프트웨어 버그다. 코드를 수정한 후 (일반적으로 새 기능을 출시한 후) 기능이 의도한 대로 작동하지 않는 경우다. 회귀 방지 지표에 대한 테스트 점수가 얼마나 잘 나오는지 평가하려면 다음 사항을 고려해야한다. - 테스트 중에 실행되는 코드의양
- 코드 복잡도
- 코드의 도메인 유의성
최상의 보호를 위해서는 테스트가 해당 라이브러리, 프레임워크, 외부 시스템을 테스트 범주에 포함시켜서 소프트웨어가 이러한 의존성에 대해 검증이 올바른지 확인한다.
4.1.2 두 번째 요소: 리팩터링 내성
리팩터링 내성은 테스트를 '빨간색(실패)'으로 바꾸지 않고 기본 애플리케이션 코드를 리팩터링할 수 있는지에 대한 척도다. 리팩터링 내성 지표에서 테스트 점수가 얼마나 잘 나오는지 평가하려면 테스트에서 얼마나 많이 거짓 양성이 발생하는지 살펴봐야한다. 거짓 양성에 신경써야하는 이유는 2가지 장점이 있다.
- 기존 기능이 고장 났을 때 테스트가 조기 경고를 제공한다. 이러한 조기 경고 덕분에 결함이 있는 코드가 운영 환경에 배포되기 훨씬 전에 문제를 해결할 수 있다.
- 코드 변경이 회귀로 이어지지 않을 것이라고 확신하게 된다. 이러한 확신이 없으면 리팩터링을 하는 데 주저하게 되고 코드베이스가 나빠질 가능성이 훨씬 높아진다.
거짓 양성은 이 두가지 이점을 모두 방해한다.
- 테스트가 타당한 이유 없이 실패하면, 코드 문제에 대응하는 능력과 의지가 희석된다.
- 테스트 스위트에 대한 신뢰가 서서히 떨어지며, 더 이상 믿을 만한 안전망으로 인식하지 않는다. 이렇게 신뢰가 부족해지면 리팩터링이 줄어든다. 회귀를 피하려고 코드변경을 최소한으로 하기 때문이다.
거짓양성이란 허위 경보다. 실제로 기능이 의도한 대로 작동하지만 테스트는 실패를 나타내는 결과다.
4.1.3 무엇이 거짓 양성의 원인인가?
테스트에서 발생하는 거짓 양성의 수는 테스트 구성 방식과 직접적인 관련이 있다. 테스트와 테스트 대상 시스템(SUT)의 구현 세부사항이 많이 결합할수록 허위 경보가 더 많이 생긴다. 거짓 양성이 생길 가능성을 줄이는 방법은 해당 구현 세부 사항에서 테스트를 분리하는 것뿐이다. 체스트를 통해 SUT가 제공하는 최종 결과를 검증하는지 확인해야 한다.
4.1.4 구현 세부 사항 대신 최종 결과를 목표로 하기
테스트를 깨지지 않고 리팩터링 내성을 높이는 방법은 SUT의 구현 세부 사항과 테스트 간의 결합도를 낮추는 것뿐이다. 즉, 코드의 내부 작업과 테스트 사이를 가능한 한 멀리 떨어뜨리고 최종 결과를 목표로 하는 것이다.
4.2 첫 번째 특성과 두 번째 특성 간의 본질적인 관계
4.2.1 테스트 정확도 극대화
오류 유형 표 | 기능 | ||
작동 | 고장 | ||
테스트 결과 | |||
테스트 통과 | 올바른 추론 (참 음성) | 2종 오류 (거짓 음성) | |
테스트 실패 | 1종 오류 (거짓 양성) | 올바른 추론 (참 양성) |
- 올바른 추론 (참 양성): 기능이 고장 나서 테스트가 실패하는 상황
- 올바른 추론 (참 음성): 테스트가 통과하고 기본 기능이 의도한 대로 잘 작동하는 상황
- 1종 오류 (거짓 양성): 기능은 올바르지만 테스트가 실패하는 상황
- 2종 오류 (거짓 음성): 기능은 고장났지만 테스트가 통과하는 상황
4.3 세 번째 요소와 네 번째 요소: 빠른 피드백과 유지보수성
- 테스트가 얼마나 이해하기 어려운가
- 테스트가 얼마나 실행하기 어려운가
4.4 이상적인 테스트를 찾아서
좋은 단위 테스트의 4대 특정 - 회귀 방지
- 리팩터링 내성
- 빠른 피드백
- 유지 보수성
테스트 코드를 포함한 모든 코드는 책임이다.테스트 스위트를 탄탄하게 만들려면 테스트의 불안정성(거짓 양성)을 제거하는 것이 최우선 과제다.
참고
'개발관련 서적 정리 > Unit Testing' 카테고리의 다른 글
6. 단위 테스트 스타일 (0) | 2023.02.08 |
---|---|
5. 목과 테스트 취약성 (0) | 2023.02.06 |
3. 단위 테스트 구조 (1) | 2023.02.05 |
2. 단위 테스트란 무엇인가 (1) | 2023.02.05 |
1. 단위 테스트의 목표 (0) | 2023.02.05 |