테스트 코드나 테스트 습관에서 나는, 더 깊은 문제를 알리는 신호. 제라드 메스자로스의 xUnit 테스트 패턴 정리가 이름을 붙였다.
테스트에서 보이는 냄새
- 깨지기 쉬운 테스트(Fragile Test): 동작은 그대로인데 구현을 조금 바꿨다고 실패한다. 구현 세부에 기대는 테스트다
- 변덕스러운 테스트(Erratic Test): 같은 코드인데 통과했다 실패했다 한다. 공유 상태, 시간, 실행 순서가 흔한 원인이다
- 알아보기 어려운 테스트(Obscure Test): 무엇을 검사하는지 한눈에 안 들어온다
- 단언 룰렛(Assertion Roulette): 단언이 여럿이라 어느 것이 실패했는지 알기 어렵다
- 조건부 테스트 로직(Conditional Test Logic): 테스트 안에 if가 있어 어떤 코드가 실제로 실행됐는지 모른다
- 느린 테스트(Slow Tests), 테스트하기 어려운 코드(Hard-to-Test Code), 테스트 코드 중복(Test Code Duplication), 프로덕션 코드 속 테스트 로직(Test Logic in Production)
프로젝트에서 보이는 냄새
테스트 자체에 버그가 많음, 테스트 유지 비용이 큼, 프로덕션에서 버그가 너무 많이 나옴, 개발자가 테스트를 쓰지 않음.
처방 몇 가지
- 필요 없는 픽스처를 걷어 최소 데이터만 남긴다
- 테스트가 쓰는 자원(파일·DB 행) 이름을 고유하게 한다
- 의존 대상을 테스트 대역(Test Double)으로 바꿔 의존을 끊는다(MSW로 API 모킹)
- 테스트하기 어려운 로직은 따로 실행할 수 있는 컴포넌트로 뽑는다(함수 추출하기)
테스트가 많아서 생기는 문제
커버리지가 겹치는 테스트가 많으면 한 번 고칠 때 여러 테스트가 함께 깨져 오히려 변경을 막는다. 각 테스트가 잘 격리된 부분을 맡도록 겹침을 줄이면 적은 테스트로도 신뢰를 지킬 수 있다(구성요소 줄이기). 프로덕션 코드의 냄새는 코드 냄새에 있다.
출처: Test Smells — xUnit Test Patterns 제라드 메스자로스 · 인프런 『심플 디자인』 박영록