신뢰할 수 있고, 유지보수 가능하며, 가치 있는 좋은 테스트를 작성하는 것은 확립된 모범 사례를 따릅니다. 나쁜 테스트(깨지기 쉽고, 느리고, 불명확한)는 부담이 되지만, 좋은 테스트는 지속적인 가치를 제공합니다. 이런 사례를 이해하는 것이 효과적인 테스팅에 중요합니다.
좋은 테스트의 특징 (FIRST)
FAST → 빠르게 실행 (그래서 자주 실행)
INDEPENDENT/ISOLATED → 서로나 순서에 의존하지 않음; 각자 자체 상태를 설정
REPEATABLE → 어떤 환경에서도 매번 같은 결과 (불안정성 없음)
SELF-VALIDATING → 명확한 통과/실패 (수동 검사가 아닌 어서션)
TIMELY → 코드와 함께(또는 먼저) 작성
핵심 관행
✓ 구현이 아닌 동작 테스트 → 테스트가 리팩터링에서 살아남음 (내부를 테스트하지 않음)
✓ 테스트당 하나의 개념 → 집중된 테스트; 하나가 깨질 때 무엇이 실패했는지 명확
✓ 명확한 이름 — 무엇을 테스트하는지 기술 ("이메일이 유효하지 않으면 오류 반환")
✓ Arrange-Act-Assert 구조 → 읽기 쉽고, 정돈됨
✓ 엣지 케이스와 오류 조건 커버 (happy path뿐 아니라)
✓ 테스트를 단순하고 읽기 쉽게 유지 (테스트는 문서; 테스트 내 복잡한 로직 회피)
✓ 결정적 — 시간, 무작위성, 외부 상태, 순서에 의존하지 않음 (불안정성 회피)
✓ DRY하되 읽기 쉽게 — 설정 공유(fixture)하되 각 테스트는 자체적으로 명확하게
