이 페이지에서는 Test Optimization에서 제공하는 최적화 기능이 의도대로 작동하는지 검사하는 방법을 설명합니다. 이 가이드는 Test Optimization이 검증 대상 리포지토리에서 이미 작동하고 있다고 가정하며, 단일 리포지토리에 대한 최적화 검사 단계를 보여줍니다.
로컬 코딩 에이전트 검증은 현재 미리 보기 상태이며, npm dd-trace 패키지를 사용하는 JavaScript 및 TypeScript 프로젝트만 지원합니다.
아래 제공된 프롬프트를 사용하여 로컬 코딩 에이전트(로컬 리포지토리를 검사하고 명령을 실행할 수 있는 AI 어시스턴트)에게 설치된 dd-trace 패키지를 검사하고 Test Optimization 검사 런북을 실행하도록 요청하세요. 이 방법은 로컬 라이브러리 호환성과 CI 구성을 검증합니다. 또한 Datadog 설정을 변경하거나 Datadog에 검증 결과를 전송하지 않고 조기 불안정성 탐지, 자동 테스트 재시도, 테스트 관리를 검증합니다.
런북은 설치된 ci/runbook.md 패키지 루트를 기준으로 dd-trace에 위치합니다.
다음 프롬프트를 로컬 코딩 에이전트에 전달하세요.
Locate the installed dd-trace package, then read and execute its ci/runbook.md.
이 코딩 에이전트 방식은 전체 Datadog 워크플로를 실행하지 않는 로컬 검사입니다. 전체 예방, 완화, 수정 워크플로를 검증하거나 JavaScript 또는 TypeScript 이외의 언어를 검증하려면 아래의 옵션 2를 사용하세요.
옵션 2: 전체 워크플로 검증
이 검증 워크플로는 Datadog의 전체 Test Optimization 워크플로를 검증합니다. 이 검증들은 동일한 브랜치와 테스트를 사용하므로 예방, 완화, 수정 순서대로 수행하세요.
1단계: 검증 설정
이 가이드는 로컬 변경 사항을 만들고 CI가 실행되도록 커밋하는 과정을 안내합니다. 이 가이드는 전용 테스트 서비스와 브랜치를 사용하여 검증 워크플로가 리포지토리의 다른 개발자에게 미치는 영향을 최소화합니다.
테스트 명령을 실행하기 전에 DD_SERVICE를 설정하도록 CI 테스트 작업을 구성하세요.
exportDD_SERVICE=validate-test-optimization
검증 브랜치를 생성합니다.
git checkout -b validate-test-optimization
CI 구성 변경 사항 중 DD_SERVICE를 설정하는 항목을 커밋한 다음, 검증 브랜치를 푸시하여 테스트 실행을 트리거합니다.
git add -A
git commit -m "Configure Test Optimization validation service"git push -u origin validate-test-optimization
Datadog은 테스트가 해당 이름으로 보고될 때 validate-test-optimization 서비스를 감지합니다.
리포지토리 설정으로 돌아갑니다. 불안정한 테스트 정책는 개별 테스트 서비스가 아닌 리포지토리의 모든 테스트 서비스에 적용됩니다. 검증 정책의 영향을 제한하려면 validate-test-optimization 브랜치에 대해서만 구성하세요. Flaky Test Policies 아래의 Quarantine 타일에서 Configure를 클릭합니다.
두 번째 자동 규칙 활성화: validate-test-optimization 브랜치에서 활성 상태인 불안정한 테스트가 발생하면 ‘Quarantined’로 이동합니다.
첫 번째 시도에서 실패하고 재시도 시 통과하는 테스트를 추가합니다(아래 제공된 코드를 필요시 사용). Datadog에서 식별할 수 있도록 테스트 이름에 flaky와 validation이 모두 포함되어야 합니다.
constfs=require('node:fs');constos=require('node:os');constpath=require('node:path');test('flaky validation test',()=>{constmarker=path.join(os.tmpdir(),'dd-validation-flaky');if(!fs.existsSync(marker)){fs.writeFileSync(marker,'1');thrownewError('first attempt fails so Datadog can retry it');}});
frompathlibimportPathfromtempfileimportgettempdirdeftest_flaky_validation_test():marker=Path(gettempdir())/"dd-validation-flaky"ifnotmarker.exists():marker.write_text("1")raiseAssertionError("first attempt fails so Datadog can retry it")
import staticorg.junit.jupiter.api.Assertions.fail;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importorg.junit.jupiter.api.Test;classValidationFlakyTest{@TestvoidflakyValidationTest()throwsIOException{Pathmarker=Paths.get(System.getProperty("java.io.tmpdir"),"dd-validation-flaky");if(Files.notExists(marker)){Files.write(marker,newbyte[]{'1'});fail("first attempt fails so Datadog can retry it");}}}
require'tmpdir'RSpec.describe'validation flaky tests'doit'flaky validation test'domarker=File.join(Dir.tmpdir,'dd-validation-flaky')unlessFile.exist?(marker)File.write(marker,'1')raise'first attempt fails so Datadog can retry it'endendend
usingSystem.IO;usingXunit;publicclassValidationFlakyTests{ [Fact]publicvoidFlakyValidationTest(){varmarker=Path.Combine(Path.GetTempPath(),"dd-validation-flaky");if(!File.Exists(marker)){File.WriteAllText(marker,"1");thrownewSystem.Exception("first attempt fails so Datadog can retry it");}}}
packagevalidationimport("errors""os""path/filepath""testing")funcTestFlakyValidationTest(t*testing.T){marker:=filepath.Join(os.TempDir(),"dd-validation-flaky")if_,err:=os.Stat(marker);errors.Is(err,os.ErrNotExist){ifwriteErr:=os.WriteFile(marker,[]byte("1"),0600);writeErr!=nil{t.Fatal(writeErr)}t.Fatal("first attempt fails so Datadog can retry it")}}
importXCTestfinalclassValidationFlakyTests:XCTestCase{functestFlakyValidationTest()throws{letmarker=FileManager.default.temporaryDirectory.appendingPathComponent("dd-validation-flaky")if!FileManager.default.fileExists(atPath:marker.path){try"1".write(to:marker,atomically:true,encoding:.utf8)XCTFail("first attempt fails so Datadog can retry it")}}}
테스트를 커밋하고 푸시한 다음, 검증 브랜치에서 풀 리퀘스트를 엽니다.
git add -A
git commit -m "Validate Test Optimization prevention"git push origin validate-test-optimization
CI가 실행될 때까지 기다립니다. 조기 불안정성 감지가 새 테스트를 재시도하고, 신규 불안정한 테스트 PR 게이트가 결과를 평가합니다. 풀 리퀘스트에 대한 GitHub 검사에서 신규 불안정한 테스트 PR 게이트가 실패하는지 확인합니다:
실패한 GitHub 검사를 클릭하고 해당 테스트가 새로운 불안정한 테스트 목록에 포함되어 있는지 확인합니다:
테스트 실행에서 조기 불안정성 탐지가 테스트를 재시도했는지, 그리고 다음 필터를 사용하는 이 쿼리를 사용하여 새로운 불안정한 테스트로 감지했는지 확인합니다:
예방을 위해 추가한 동일한 테스트에서 마커 파일 이름을 dd-validation-flaky에서 dd-validation-flaky-mitigation으로 변경합니다. 테스트 함수나 테스트 케이스의 이름을 변경하지 마세요. 새 마커는 또 다른 의도적인 첫 번째 시도 실패를 유발합니다. 테스트 이름을 변경하지 않고 유지하면 Datadog이 해당 실행을 예방 중에 감지된 불안정한 테스트와 연결할 수 있습니다. 추가적인 Datadog 구성은 필요하지 않으며, 자동 테스트 재시도 및 불안정한 테스트 관리가 이 실행 중에 테스트를 처리합니다. 사용 중인 언어에 맞게 테스트를 업데이트합니다.
constfs=require('node:fs');constos=require('node:os');constpath=require('node:path');test('flaky validation test',()=>{// Changed from dd-validation-flaky.
constmarker=path.join(os.tmpdir(),'dd-validation-flaky-mitigation');if(!fs.existsSync(marker)){fs.writeFileSync(marker,'1');thrownewError('first attempt fails so Datadog can retry it');}});
frompathlibimportPathfromtempfileimportgettempdirdeftest_flaky_validation_test():# Changed from dd-validation-flaky.marker=Path(gettempdir())/"dd-validation-flaky-mitigation"ifnotmarker.exists():marker.write_text("1")raiseAssertionError("first attempt fails so Datadog can retry it")
import staticorg.junit.jupiter.api.Assertions.fail;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importorg.junit.jupiter.api.Test;classValidationFlakyTest{@TestvoidflakyValidationTest()throwsIOException{// Changed from dd-validation-flaky.Pathmarker=Paths.get(System.getProperty("java.io.tmpdir"),"dd-validation-flaky-mitigation");if(Files.notExists(marker)){Files.write(marker,newbyte[]{'1'});fail("first attempt fails so Datadog can retry it");}}}
require'tmpdir'RSpec.describe'validation flaky tests'doit'flaky validation test'do# Changed from dd-validation-flaky.marker=File.join(Dir.tmpdir,'dd-validation-flaky-mitigation')unlessFile.exist?(marker)File.write(marker,'1')raise'first attempt fails so Datadog can retry it'endendend
usingSystem.IO;usingXunit;publicclassValidationFlakyTests{ [Fact]publicvoidFlakyValidationTest(){// Changed from dd-validation-flaky.varmarker=Path.Combine(Path.GetTempPath(),"dd-validation-flaky-mitigation");if(!File.Exists(marker)){File.WriteAllText(marker,"1");thrownewSystem.Exception("first attempt fails so Datadog can retry it");}}}
packagevalidationimport("errors""os""path/filepath""testing")funcTestFlakyValidationTest(t*testing.T){// Changed from dd-validation-flaky.marker:=filepath.Join(os.TempDir(),"dd-validation-flaky-mitigation")if_,err:=os.Stat(marker);errors.Is(err,os.ErrNotExist){ifwriteErr:=os.WriteFile(marker,[]byte("1"),0600);writeErr!=nil{t.Fatal(writeErr)}t.Fatal("first attempt fails so Datadog can retry it")}}
importXCTestfinalclassValidationFlakyTests:XCTestCase{functestFlakyValidationTest()throws{// Changed from dd-validation-flaky.letmarker=FileManager.default.temporaryDirectory.appendingPathComponent("dd-validation-flaky-mitigation")if!FileManager.default.fileExists(atPath:marker.path){try"1".write(to:marker,atomically:true,encoding:.utf8)XCTFail("first attempt fails so Datadog can retry it")}}}
동일한 브랜치에서 변경 사항을 커밋하고 푸시합니다.
git add -A
git commit -m "Validate Test Optimization mitigation"git push origin validate-test-optimization
CI가 실행될 때까지 기다린 후 다음 결과를 확인합니다.
테스트 실행에서 자동 테스트 재시도가 첫 번째 실패 후 테스트를 다시 실행하며, 재시도에서 테스트가 통과합니다. 이 쿼리를 다음 필터와 함께 사용하세요.
@test.name:*flaky*validation*
@git.branch:validate-test-optimization
@test.retry_reason:auto_test_retry
불안정한 테스트 관리에서 테스트가 QUARANTINED로 표시됩니다. 해당 실패는 더 이상 테스트 작업을 차단하지 않습니다. 이 쿼리를 다음 필터와 함께 사용하세요:
@test.name:*flaky*validation*
first_flaked_branch:validate-test-optimization
flaky_test_state:quarantined
4단계: 수정
Test Optimization은 수정 시도 및 Bits AI 기반 불안정한 테스트 수정을 통해 불안정한 테스트를 수정하도록 돕습니다. 이 섹션에서는 예방 및 완화에 사용된 동일한 테스트를 수정하여 수정 시도 워크플로를 검증합니다.