Datadog 지능형 테스트 러너(Intelligent Test Runner) 작동법

개요

지능형 테스트 러너는 Datadog의 테스트 영향 분석 솔루션입니다. 테스트 영향 분석 기술은 지난 수십 년 동안 많이 사용되어 온 기술입니다. 그러나 해당 기술은 대개 구현하기 어렵고 시간도 많이 걸립니다. 지능형 테스트 러너로 이러한 복잡한 과정을 간소화할 수 있도록 도와드립니다.

테스트 영향 분석 기술은 각 테스트를 테스트가 사용하는 리포지토리의 코드 파일 집합에 매핑합니다(테스트별로 코드 검사). 본 분석의 목표는 코드 변경의 영향을 받지 않는 테스트를 건너뛰는 것입니다. 이를 통해 CI에서 테스트에 소요되는 시간을 직접 줄일 수 있습니다.

극단적인 예로, README 파일의 오타만 변경하는 풀 리퀘스트가 있습니다. 해당 PR의 경우, 모든 테스트를 실행하는 것은 전혀 이득이 되지 않습니다. 오히려 테스트가 불완전하다면 CI가 실패하여 병합 전에 파이프라인을 여러 번 다시 시도해야 할 수도 있습니다. 이는 개발자와 CI 모두의 시간을 낭비하는 일입니다. 지능형 테스트 러너를 사용하면 README 파일을 변경하는 PR이 모든 테스트를 건너뛸 수 있습니다.

차별화 요소

일부 테스트 선택 솔루션은 코드 검사 데이터에 의존하지 않고 기계 학습을 사용하여 이를 보완합니다. 본 시스템은 확률 방식으로 관련된 테스트를 추론하므로, 관련된 테스트를 놓쳐 기본 브랜치의 빌드 실패를 초래할 수 있습니다. 기계 학습 기반 기술은 일반적으로 제대로 작동하기까지 보다 오랜 기간의 데이터 수집이 필요합니다. 지능형 테스트 러너는 코드 검사의 기준이 수집되는 즉시 작동을 시작합니다.

다른 테스트 솔루션도 코드 검사를 활용하여 테스트 영향 분석을 산출하지만, 실행할 테스트를 평가할 때 마지막 커밋 차이값만 고려합니다. 예를 들어, 병합을 허용하는데 최신 커밋의 CI 상태만 고려하는 GitHub의 풀 리퀘스트 문제가 있습니다. 결과적으로 모든 커밋을 CI를 통해 실행해야 하거나 실행해야 할 테스트를 건너뛸 위험이 있습니다.

지능형 테스트 러너는 테스트 가시성 데이터와 함께 테스트별 코드 검사 정보를 활용하여 모든 관련 기존 커밋에서 이전 테스트를 검색합니다. 지능형 테스트 러너 설정은 대부분의 언어에서 원클릭으로 작동하며, 다른 방법보다 정확하고 정밀한 결과를 제공해 드립니다.

테스트 선택 작동법

지능형 테스트 러너를 활성화하면 테스트별(또는 프레임워크에 따라 스위트별) 코드 검사 데이터가 명료하게 수집되어 Datadog으로 전송됩니다.

Datadog 백엔드는 이전 테스트 실행 데이터 검색에 해당 정보를 활용하여 특정 테스트를 건너뛸 수 있는지 결정합니다. Datadog에 검사 및 추적된 파일이 현재 커밋과 동일한 커밋에서 테스트를 통과한 기록이 있다면 해당 테스트를 건너뜁니다. 이는 코드 변경이 테스트에 영향을 미치지 않았다는 증거로 활용됩니다.

지능형 테스트 러너의 테스트 선택 프로세스에서 테스트를 건너뛸 수 있는 이유를 설명하는 벤 다이어그램

Datadog 라이브러리는 소스에서 건너뛸 수 없음으로 표시된 테스트를 건너뛸 수 있는 테스트 목록에서 삭제합니다. 이후에 테스트를 실행하나 테스트 프레임워크가 건너뛸 수 있는 테스트 목록에 있는 테스트를 건너뛰도록 합니다.

지능형 테스트 러너가 건너뛴 테스트

구체적인 예시를 살펴보겠습니다.

메인 브랜치 및 기능 브랜치에 여러 개의 커밋이 존재하는 풀 리퀘스트가 추적한 파일로 어떻게 다른 결과를 산출할 수 있는지 설명하는 다이어그램

위의 다이어그램은 main에서 분기되어 여러 개의 커밋이 존재하는 개발자 브랜치를 보여줍니다. 각 커밋에서 CI는 서로 다른 결과를 산출하는 두 가지 테스트(A와 B)를 실행 중입니다.

  • 커밋 1은 두 테스트를 모두 실행했습니다. 본 커밋에는 추적된 파일에 영향을 미치는 변경 사항과 A와 B의 검사 파일이 모두 포함되어 있습니다.
  • 다음과 같이 커밋 2가 두 테스트를 다시 실행했습니다.
    • 본 커밋이 테스트 A에 영향을 미치지는 않았지만(추적된 파일이나 검사한 파일에 변경 사항이 없음), 테스트 A를 통과한 기존 테스트 실행이 존재하지 않기 때문에 테스트 A를 실행해야 합니다. 지능형 테스트 러너는 테스트가 실행된 경우 통과 여부를 보장할 수 없으므로 이를 건너뛰지 않습니다. 이번에는 테스트가 통과되었으므로 이는 비정상적 테스트(Flaky Test)가 됩니다.
    • 테스트 B의 경우 해당 테스트에 관해 기존에 실행 성공한 테스트가 존재하지 않고, 커밋 2가 영향을 미치는 파일을 변경하기 때문에 두 가지 모두 실행되었습니다.
  • 추적된 파일이 변경되었으므로 커밋 3은 모든 테스트를 실행합니다.
  • 커밋 4는 다음 테스트를 모두 실행합니다.
    • 모든 기준을 충족하는 기존 테스트 실행이 존재하지 않기 때문에 테스트 A를 실행합니다. 커밋 1 및 3의 테스트 실행이 실패했기 때문에 이를 사용할 수 없고, 커밋 2의 테스트 실행은 커밋 2부터 커밋 4까지 추적한 파일이 변경되었기 때문에 사용할 수 없습니다.
    • 모든 기준을 충족하는 기존 테스트 실행이 존재하지 않기 때문에 테스트 B를 실행합니다. 커밋 1 및 2의 테스트 실행이 실패했기 때문에 이를 사용할 수 없고, 커밋 2과 4 사이에 테스트 B 검사 파일이 변경되었으므로 커밋 3 테스트 실행은 사용할 수 없습니다.
  • 커밋 5는 다음 테스트 하나를 건너뛸 수 있었습니다.
    • 커밋 4에서의 테스트 실행 덕분에 테스트 A를 건너뛸 수 있습니다. 본 테스트 실행의 경우, 커밋 4와 5 사이에 추적된 파일이 변경되지 않았고, 테스트 A의 영향을 받는 파일도 없으며, 테스트 A가 커밋 4에서 통과되었기 때문에 필요한 모든 기준을 충족합니다. 따라서, 테스트가 실행되면 커밋 4에서와 동일한 코드 경로를 실행하고 CI에 새로운 정보를 제공하지 않습니다. 이 경우 테스트 A를 건너뛰면 두 가지 이점이 있습니다. 테스트를 실행하지 않음으로써 성능/비용 측면에서 이점이 있습니다. 또한 테스트 A가 비정상적인 테스트이기에 CI의 안정성이 높아집니다.
    • 커밋 5에서 검사 파일이 변경되었기 때문에 테스트 B를 실행해야 했습니다.
  • 커밋 6은 다음 두 가지 테스트를 모두 건너뛸 수 있었습니다.
    • 커밋 4에서의 테스트 실행 덕분에 테스트 A를 건너뛸 수 있습니다.
    • 커밋 5에서의 테스트 실행 덕분에 테스트 B를 건너뛸 수 있습니다.

참고 자료