좋은 테스트란 무엇일까?
정답은 없다.
다만, 좋은 테스트로 느껴지는 코드가 공유하는 몇 가지 특성이 있다.
FISRT 속성은 그런 편-안한 테스트가 갖는 공통 특성이다.
🛎️ FIRST
F
ast
I
solated
R
epeatable
S
elf-validating
T
imely
1️⃣ F
ast → 빠른 속도
- 빠른 테스트
- 외부시스템(DB, 네트워크) 접근 X
- 로컬 로직코드만 실행
- N millisec
- 느린 테스트
- 외부시스템 접근 O
- 외부 자원 접근하는 코드 실행
- 10^n millisec
- 판단방법
- 단위테스트를 하루에 3번 이상 하기 어렵다? → 뭔가 잘못
- 통합테스트 불가능하다 → 상당히 잘못되었다.
- 테스트 방법
- DB 작업에 대한 map을 만들어서 map을 테스트 → 로컬 코드 테스트
- mock 을 이용한 외부 자원 반환값 테스트
2️⃣ I
solated → 독립된 테스트
- 최대한 테스트 대상이 작아야 함.
- 단위(Unit; 코드)에 집중
- 외부시스템과의 상호작용은 테스트 실패 가능성을 증대
- 다른 단위 테스트에 의존 X
- 가급적 TestInstance를 PER_METHOD(기본값)으로 두고 사용
- 순서, 시간 관계없이 실행 가능
- LifeCycle 이용하지 않고 실행가능한 테스트 환경 조성 필요
- SRP 가 잘 지켜질 수 있도록 로직 작성
3️⃣ R
epeatable → 반복 가능한 코드
- 실행할 때마다 같은 결과
- 직접 통제할 수 없는 항목과 분리
- 외부 환경 (DB, 네트워크, 사용자 입력)
- 무작위값 (랜덤값, 날짜)
- 해결법
- mock 객체 사용
- 테스트 대상 코드만 남기고 나머지는 테스트에서 배제할 수 있도록 하는 모든 방법 유효
- 테스트할 대상에 통제할 수 있는 값을 파라미터로 넣도록 구조 변경
4️⃣ S
elf-Validating → 자가검증 테스트
- 테스트에 필요한 설정은 모두 자동화
- 테스트 실행 시점 (순서, 시간) 자동화
- 테스트 기대값이 명확
5️⃣ T
imely: 적시 사용 테스트