Este producto no es compatible con el sitio Datadog seleccionado. ().
Esta página explica cómo verificar que las optimizaciones ofrecidas por Test Optimization funcionen según lo previsto. La guía asume que Test Optimization ya funciona para el repositorio bajo validación, y muestra los pasos para validar las optimizaciones para un solo repositorio.
Ejecute estas validaciones solo en una rama de características y no las combine en su rama predeterminada o principal.
Requisitos previos
Estas optimizaciones requieren una biblioteca nativa compatible. Las cargas de archivos XML de JUnit no son compatibles.
Opción 1: Validar localmente con un agente de codificación
¡Únase a la vista previa!
La validación con agente de codificación local está en versión preliminar y solo es compatible con proyectos de JavaScript y TypeScript que utilizan el paquete dd-trace.
Utilizando el prompt proporcionado a continuación, pídale a un agente de codificación local (un asistente de IA que puede inspeccionar y ejecutar comandos en su repositorio local) que inspeccione su dd-tracepaquete instalado y ejecute su manual de validación de Test Optimization. Este método verifica la compatibilidad de la biblioteca local y la configuración de CI. También verifica Early Flake Detection, Auto Test Retries y Test Management sin cambiar la configuración de Datadog ni enviar resultados de validación a Datadog.
El manual se encuentra en ci/runbook.md en relación con la raíz del paquete dd-trace instalado.
Pase este prompt a su agente de codificación local:
Locate the installed dd-trace package, then read and execute its ci/runbook.md.
Este método de agente de codificación es una verificación local que no ejecuta todo el flujo de trabajo de Datadog. Para validar los flujos de trabajo completos de Prevención, Mitigación y Remediación, o para validar un lenguaje distinto a JavaScript o TypeScript, use la Opción 2, a continuación.
Opción 2: Validar el flujo de trabajo completo
Este flujo de trabajo de validación comprueba el flujo de trabajo completo de Test Optimization en Datadog. Realice estas validaciones (Prevención, Mitigación y Remediación) en orden, ya que utilizan la misma rama y la prueba.
Paso 1: Configurar la validación
Esta guía lo lleva a través de la realización de cambios locales y su confirmación para que la CI los ejecute. Utiliza un servicio de pruebas y una rama dedicados para minimizar el impacto del flujo de trabajo de validación en otros desarrolladores del repositorio.
Configure su trabajo de prueba de CI para establecer DD_SERVICE antes de que ejecute el comando de prueba:
exportDD_SERVICE=validate-test-optimization
Cree la rama de validación:
git checkout -b validate-test-optimization
Confirme el cambio de configuración de CI que establece DD_SERVICE, luego envíe la rama de validación para activar una ejecución de prueba:
git add -A
git commit -m "Configure Test Optimization validation service"git push -u origin validate-test-optimization
Datadog detecta el validate-test-optimizationservicio cuando las pruebas se reportan bajo ese nombre.
Regrese a la configuración del repositorio. Flaky Test Policies se aplican a cada servicio de pruebas en el repositorio, no a un servicio de pruebas individual. Para limitar el impacto de la política de validación, configúrela solo para la rama validate-test-optimization. En Flaky Test Policies, en el mosaico Quarantine, haga clic en Configure.
Habilite la segunda regla automática: Si una prueba inestable activa falla en la rama validate-test-optimization, muévala a Cuarentena.
Haga clic en Save.
Cree un New Flaky Test PR Gate y asígnele el contexto del repositorio que está validando.
Agregue una prueba que falle en el primer intento y pase en los reintentos (opcionalmente usando el código proporcionado a continuación). El nombre de la prueba debe contener tanto flaky como validation para que pueda identificarla en 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")}}}
Confirme y envíe (push) la prueba, luego abra una solicitud de extracción (pull request) desde la rama de validación:
git add -A
git commit -m "Validate Test Optimization prevention"git push origin validate-test-optimization
Espere a que se ejecute la CI. La detección temprana de inestabilidad (Early Flake Detection) reintenta la nueva prueba, y la puerta de PR de nueva prueba inestable (New Flaky Test PR Gate) evalúa el resultado. En las verificaciones de GitHub para su solicitud de extracción, confirme que la puerta de PR de nueva prueba inestable (New Flaky Test PR Gate) falle:
Haga clic en la verificación de GitHub fallida y confirme que la prueba esté incluida en la lista de nuevas pruebas inestables:
En Test Runs, confirme que la detección temprana de inestabilidad (Early Flake Detection) reintentó la prueba y la detectó como una nueva prueba inestable usando esta consulta, que utiliza los siguientes filtros:
@test.name:*flaky*validation*
@git.branch:validate-test-optimization
@test.retry_reason:early_flake_detection
@test.test_management.is_new_flaky:true
Paso 3: Mitigación
La mitigación se logra a través de Auto Test Retries, Flaky Test Management y Flaky Test Policies. Estas funciones reintentan las pruebas inestables y ponen en cuarentena las fallas inestables conocidas para que no bloqueen la CI.
En la misma prueba que agregó para Prevención, cambie el nombre del archivo de marcador de dd-validation-flaky a dd-validation-flaky-mitigation. No cambie el nombre de la función de prueba ni del caso de prueba. El nuevo marcador provoca otra falla intencional en el primer intento. Mantener el nombre de la prueba sin cambios permite que Datadog asocie la ejecución con la prueba inestable detectada durante la Prevención. No se requiere configuración adicional de Datadog; Auto Test Retries y Flaky Test Management manejan la prueba durante esta ejecución. Actualice la prueba para su idioma:
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")}}}
Confirme y envíe (push) el cambio en la misma rama:
git add -A
git commit -m "Validate Test Optimization mitigation"git push origin validate-test-optimization
Espere a que se ejecute la CI y, a continuación, confirme los siguientes resultados:
En Test Runs, Auto Test Retries vuelve a ejecutar la prueba después de su primer intento fallido, y la prueba pasa en el reintento. Utilice esta consulta, con los siguientes filtros:
@test.name:*flaky*validation*
@git.branch:validate-test-optimization
@test.retry_reason:auto_test_retry
En Flaky Test Management, la prueba aparece como QUARANTINED. Sus fallos ya no bloquean el trabajo de prueba. Utilice esta consulta, con los siguientes filtros:
Espere a que finalice la CI y, a continuación, confirme los siguientes resultados:
En Test Runs, Attempt to Fix volvió a intentar el candidato a corrección y todos los intentos fueron exitosos. Utilice esta consulta, que tiene los siguientes filtros:
Elimine la rama validate-test-optimization. La regla automática de cuarentena específica de la rama ya no se aplica después de que se elimina la rama, y el servicio de validación dedicado ya no recibe ejecuciones de prueba.
Notifique al equipo propietario del repositorio que el New Flaky Test PR Gate permanece activo para todo el repositorio. La puerta no es bloqueante de forma predeterminada.
Opcionalmente, habilite las funciones de Test Optimization configuradas para el servicio validate-test-optimization a nivel de repositorio.
Lecturas adicionales
Documentación, enlaces y artículos útiles adicionales: