TotT: 효과적인 테스트
원문: https://testing.googleblog.com/2014/05/testing-on-toilet-effective-testing.html (Translated by Google Gemini)
개별 단위 테스트를 작성하든 제품의 전체 테스트 프로세스를 설계하든, 테스트가 코드의 버그를 얼마나 효과적으로 감지하고 보고하는지 다시 한번 생각해보는 것이 중요합니다. 효과적이려면 모든 테스트가 극대화하려고 노력해야 하는 세 가지 중요한 품질이 있습니다.
충실도 (Fidelity)#
테스트 대상 코드가 손상되면 테스트는 실패합니다. 고충실도 테스트는 테스트 대상 코드의 결함에 매우 민감하여 버그가 코드에 침투하는 것을 방지하는 데 도움이 됩니다.
테스트가 코드의 모든 경로를 다루고 예상 상태에 대한 모든 관련 assertions 을 포함하는지 확인하여 충실도를 극대화하십시오.
탄력성 (Resilience)#
테스트 대상 코드가 결함이 없다면 테스트가 실패해서는 안 됩니다. 탄력적인 테스트는 테스트 대상 코드에 파괴적인 변경이 가해질 때만 실패하는 테스트입니다. 리팩토링 및 테스트 대상 코드에 대한 기타 비파괴적인 변경은 테스트를 수정할 필요 없이 수행할 수 있으므로 테스트 유지 관리 비용이 절감됩니다.
테스트 대상 코드의 노출된 API만 테스트하여 탄력성을 극대화하십시오. 내부로 들어가지 마십시오. 목(mock) 대신 스텁(stub)과 가짜(fake)를 선호하십시오. 명시적으로 검증하는 상호 작용이 아니라면 종속성과의 상호 작용을 검증하지 마십시오. 불안정한 테스트는 분명히 탄력성이 매우 낮습니다.
정밀도 (Precision)#
테스트가 실패하면 고정밀 테스트는 결함이 정확히 어디에 있는지 알려줍니다. 잘 작성된 단위 테스트는 어떤 코드 줄에 결함이 있는지 정확히 알려줄 수 있습니다. 잘못 작성된 테스트(특히 대규모 종단 간 테스트)는 종종 정밀도가 매우 낮아 무언가 고장났다는 것을 알려주지만 어디가 고장났는지 알려주지 않습니다.
테스트를 작고 집중적으로 유지하여 정밀도를 극대화하십시오. 테스트가 정확히 무엇을 검증하는지 전달하는 설명적인 메서드 이름을 선택하십시오. 시스템 통합 테스트의 경우 모든 경계에서 상태를 검증하십시오.
이 세 가지 품질은 종종 서로 긴장 관계에 있습니다. 탄력성이 높은 테스트(예: 빈 테스트)를 작성하는 것은 쉽지만, 탄력성이 높고 충실도가 높은 테스트를 작성하는 것은 어렵습니다. 테스트를 설계하고 작성할 때 이러한 품질을 구현을 안내하는 프레임워크로 사용하십시오.