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 が実行されるのを待ちます。Early Flake Detection が新しいテストを再試行し、New Flaky Test PR Gate がその結果を評価します。プルリクエストの GitHub チェックで、New Flaky Test PR Gate が失敗することを確認します。
追加した Prevention と同じテストで、マーカーのファイル名を dd-validation-flaky から dd-validation-flaky-mitigation に変更します。テスト関数やテストケースの名前は変更しないでください。新しいマーカーにより、意図的に初回試行で再度失敗が発生します。テスト名を変更しないことで、Datadog は実行結果を Prevention 中に検出された不安定なテストと関連付けることができます。Datadog の追加構成不要です。Auto Test Retries と Flaky Test Management がこの実行中のテストを処理します。希望の言語に合わせてテストを更新します。。
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 Runs において、Auto Test Retries が最初の失敗後にテストを再実行し、再試行でテストが成功します。以下のフィルターを使用して このクエリ を実行します。
@test.name:*flaky*validation*
@git.branch:validate-test-optimization
@test.retry_reason:auto_test_retry
Flaky Test Management において、テストが QUARANTINED として表示されます。その失敗は、テストジョブをブロックしなくなります。以下のフィルターを使用して このクエリ を実行します。
@test.name:*flaky*validation*
first_flaked_branch:validate-test-optimization
flaky_test_state:quarantined
ステップ 4: Remediation
Test Optimization は、Attempt to Fix および Bits AI を活用した不安定なテストの修正 を通じて、不安定なテストの修復をサポートします。このセクションでは、Prevention および Mitigation で使用されたものと同じテストを修正することで、Attempt to Fix ワークフローを検証します。