Ce produit n'est pas pris en charge par le site Datadog que vous avez sélectionné. ().
Cette page explique comment vérifier que les optimisations offertes par Test Optimization fonctionnent comme prévu. Le guide suppose que Test Optimization fonctionne déjà pour le dépôt en cours de validation, et il présente les étapes pour valider les optimisations pour un dépôt unique.
Exécutez ces validations uniquement dans une branche de fonctionnalité et ne les fusionnez pas dans votre branche par défaut ou principale.
Prérequis
Ces optimisations nécessitent une bibliothèque native prise en charge. Les téléchargements de fichiers XML JUnit ne sont pas pris en charge.
Option 1 : Valider localement avec un agent de codage
Rejoignez la Preview !
La validation par agent de codage local est en préversion et ne prend en charge que les projets JavaScript et TypeScript qui utilisent le package npm dd-trace.
À l’aide de l’invite fournie ci-dessous, demandez à un agent de codage local (un assistant IA capable d’inspecter et d’exécuter des commandes dans votre dépôt local) d’inspecter le package dd-trace installé et d’exécuter son runbook de validation Test Optimization. Cette méthode vérifie la compatibilité de la bibliothèque locale et la configuration CI. Elle vérifie également Early Flake Detection, Auto Test Retries et Flaky Test Management sans modifier les paramètres Datadog ni envoyer de résultats de validation à Datadog.
Le runbook se trouve à ci/runbook.md par rapport à la racine du package dd-trace installé.
Transmettez cette invite à votre agent de codage local :
Locate the installed dd-trace package, then read and execute its ci/runbook.md.
Cette méthode d’agent de codage est un check local qui n’exerce pas l’intégralité du workflow Datadog. Pour valider les workflows complets de prévention, d’atténuation et de remédiation, ou pour valider un langage autre que JavaScript ou TypeScript, utilisez l’Option 2, ci-dessous.
Option 2 : Valider le workflow complet
Ce workflow de validation vérifie le workflow Test Optimization complet dans Datadog. Effectuez ces validations (Prévention, Atténuation et Remédiation) dans l’ordre, car elles utilisent la même branche et le même test.
Étape 1 : Configurer la validation
Ce guide vous accompagne dans la réalisation de modifications locales et leur validation pour l’exécution de la CI. Il utilise un service de test et une branche dédiés afin de minimiser l’impact du workflow de validation sur les autres développeurs du dépôt.
Configurez votre job de test CI pour définir DD_SERVICE avant l’exécution de la commande de test :
exportDD_SERVICE=validate-test-optimization
Créez la branche de validation :
git checkout -b validate-test-optimization
Validez la modification de configuration CI qui définit DD_SERVICE, puis poussez la branche de validation pour déclencher une exécution de test :
git add -A
git commit -m "Configure Test Optimization validation service"git push -u origin validate-test-optimization
Datadog détecte le service validate-test-optimization lorsque les tests sont signalés sous ce nom.
Une fois l’intégration continue terminée, accédez aux paramètres des dépôts CI/CD et sélectionnez le dépôt que vous validez.
Dans le coin supérieur droit du panneau coulissant, cliquez sur Test Service.
Dans Test service overrides, sélectionnez le service validate-test-optimization.
Configurez les remplacements de service suivants :
Désactivez Test Impact Analysis (afin qu’il ne passe pas à côté du test de validation).
Retournez aux paramètres du dépôt. Les Flaky Test Policies s’appliquent à chaque service de test du dépôt, et non à un service de test individuel. Pour limiter l’impact de la politique de validation, configurez-la uniquement pour la branche validate-test-optimization. Sous Flaky Test Policies, sur la tuile Quarantine, cliquez sur Configure.
Activez la deuxième règle automatique : Si un Active flaky test échoue dans la branche validate-test-optimization, alors déplacez-le vers Quarantined.
Ajoutez un test qui échoue à la première tentative et réussit lors des nouvelles tentatives (en utilisant éventuellement le code fourni ci-dessous). Le nom du test doit contenir à la fois flaky et validation afin que vous puissiez l’identifier dans Datadog.
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")}}}
Commitez et poussez le test, puis ouvrez une pull request depuis la branche de validation :
git add -A
git commit -m "Validate Test Optimization prevention"git push origin validate-test-optimization
Attendez que la CI s’exécute. Early Flake Detection relance le nouveau test, et le New Flaky Test PR Gate évalue le résultat. Dans les checks GitHub de votre pull request, confirmez que le New Flaky Test PR Gate échoue :
Cliquez sur le check GitHub en échec et confirmez que le test est inclus dans la liste des nouveaux tests instables :
Dans Test Runs, confirmez qu’Early Flake Detection a relancé le test et l’a détecté comme un nouveau test instable en utilisant cette requête, qui utilise les filtres suivants :
@test.name:*flaky*validation*
@git.branch:validate-test-optimization
@test.retry_reason:early_flake_detection
@test.test_management.is_new_flaky:true
Étape 3 : Mitigation
La mitigation est obtenue grâce à Auto Test Retries, Flaky Test Management et Flaky Test Policies. Ces fonctionnalités relancent les tests instables et mettent en quarantaine les échecs instables connus afin qu’ils ne bloquent pas l’intégration continue (CI).
Dans le même test que celui ajouté pour la Prévention, remplacez le nom de fichier du marqueur dd-validation-flaky par dd-validation-flaky-mitigation. Ne renommez pas la fonction de test ou le cas de test. Le nouveau marqueur provoque un autre échec intentionnel lors de la première tentative. Le maintien du nom de test inchangé permet à Datadog d’associer l’exécution au test instable détecté lors de la Prévention. Aucune configuration Datadog supplémentaire n’est requise ; [Auto Test Retries] et [Flaky Test Management] prennent en charge le test lors de cette exécution. Mettez à jour le test pour votre langage :
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")}}}
Commitez et poussez la modification sur la même branche :
git add -A
git commit -m "Validate Test Optimization mitigation"git push origin validate-test-optimization
Attendez l’exécution de l’intégration continue (CI), puis confirmez les résultats suivants :
Dans Test Runs, [Auto Test Retries] relance le test après son premier échec, et le test réussit lors de la nouvelle tentative. Utilisez cette requête, avec les filtres suivants :
@test.name:*flaky*validation*
@git.branch:validate-test-optimization
@test.retry_reason:auto_test_retry
Dans Flaky Test Management, le test apparaît comme QUARANTINED. Ses échecs ne bloquent plus le job de test. Utilisez cette requête, avec les filtres suivants :
@test.name:*flaky*validation*
first_flaked_branch:validate-test-optimization
flaky_test_state:quarantined
Étape 4 : Remediation
Test Optimization aide à remédier aux flaky tests grâce à Attempt to Fix et aux Bits AI-powered flaky test fixes. Cette section valide le workflow Attempt to Fix en corrigeant le même test utilisé pour Prevention et Mitigation.
Supprimez la validate-test-optimizationbranche. La règle automatique Quarantine spécifique à la branche ne s’applique plus une fois la branche supprimée, et le service de validation dédié ne reçoit plus d’exécutions de test.
Informez l’équipe propriétaire du dépôt que le New Flaky Test PR Gate reste actif pour l’ensemble du dépôt. La gate est non-blocking par défaut.
Optionnellement, activez les fonctionnalités Test Optimization configurées pour le validate-test-optimization service au niveau du dépôt.
Pour aller plus loin
Documentation, liens et articles supplémentaires utiles: