원문: https://testing.googleblog.com/2023/09/else-nuances.html (Translated by Google Gemini)


테스트 피라미드는 테스트 스위트의 발전을 안내하는 정석적인 경험 법칙(heuristic)입니다. 이는 단순한 메시지를 전달합니다. 통합 테스트보다 더 많은 단위 테스트를 선호하고, 엔드 투 엔드(end-to-end) 테스트보다 더 많은 통합 테스트를 선호하라는 것입니다.

test_pyramid

테스트 피라미드는 유용하지만, 테스트 스위트가 커지고 어려운 트레이드오프(trade-off) 상황에 직면했을 때 필요한 세부 정보가 부족합니다. 테스트 스위트를 확장하려면 테스트 피라미드 그 이상이 필요합니다.

SMURF 는 테스트 스위트의 균형을 잡을 때 고려해야 할 트레이드오프들을 기억하기 쉬운 약어입니다:

  • Speed (속도): 단위 테스트는 다른 테스트 유형보다 빠르며 더 자주 실행할 수 있습니다. 즉, 문제를 더 빨리 포착할 수 있습니다.
  • Maintainability (유지보수성): (모든 유형의) 테스트를 디버깅하고 유지보수하는 데 드는 총비용은 빠르게 증가합니다. 테스트 대상 시스템이 커질수록 코드가 많아지고, 이는 의존성 변경 및 요구사항 변화에 더 많이 노출되어 더 많은 유지보수 작업을 유발합니다.
  • Utilization (자원 활용): 더 적은 자원(메모리, 디스크, CPU)을 사용하는 테스트는 실행 비용이 적게 듭니다. 좋은 테스트 스위트는 자원 활용을 최적화하여 테스트 수에 비례해 비용이 기하급수적으로 증가하지 않도록 합니다. 단위 테스트는 보통 테스트 대역(test double)을 사용하거나 시스템의 제한된 부분만 다루기 때문에 자원 활용 특성이 더 좋은 편입니다.
  • Reliability (신뢰성): 신뢰할 수 있는 테스트는 실제 문제가 발견되었을 때만 실패합니다. 불안정한(flaky) 테스트 때문에 문제를 가려내는 일은 개발자의 시간을 낭비하고 테스트를 재실행하는 자원을 소모합니다. 시스템과 그에 상응하는 테스트의 규모가 커질수록 비결정성(non-determinism, 즉 불안정성)이 스며들고, 테스트 스위트는 신뢰할 수 없게 될 가능성이 커집니다.
  • Fidelity (충실도): 충실도가 높은 테스트는 실제 운영 환경(예: 실제 데이터베이스 또는 트래픽 부하)에 더 가깝게 근사하며, 프로덕션 시스템의 동작을 더 잘 예측합니다. 통합 및 엔드 투 엔드 테스트는 현실적인 조건을 더 잘 반영할 수 있는 반면, 단위 테스트는 환경을 시뮬레이션해야 하므로 테스트 기대치와 현실 사이에 괴리가 발생할 수 있습니다.

smurf_chart

테스트 유형 대 테스트 속성(즉, SMURF)의 레이더 차트. 중심에서 멀수록 더 좋습니다.

많은 경우, SMURF 차원들 간의 관계는 팽팽한 긴장 상태에 있습니다. 하나의 차원을 개선하면 다른 차원에 영향을 줄 수 있습니다. 하지만 다른 차원을 해치지 않으면서 테스트의 하나 이상의 차원을 개선할 수 있다면, 그렇게 해야 합니다. 테스트 유형(단위, 통합, 엔드 투 엔드)을 고민할 때, 여러분의 선택은 테스트 스위트의 비용과 그것이 제공하는 가치에 중대한 영향을 미칩니다.