Este producto no es compatible con el sitio Datadog seleccionado. ().
Compatibilidad
Frameworks para tests compatibles:
Framework para tests
Versión
Notas
Jest
>= 24.8.0
Solo jsdom (en el paquete jest-environment-jsdom ) y node (en el paquete jest-environment-node ) se admiten como entornos de test. Los entornos personalizados como @jest-runner/electron/environment en jest-electron-runner no son compatibles.
Compatible a partir de dd-trace>=4.42.0 y dd-trace>=5.18.0. Solo es compatible a partir de Node.js>=18.19 o de Node.js>=20.6
La instrumentación funciona en tiempo de ejecución, por lo que cualquier transpilador como TypeScript, Webpack o Babel es compatible desde el primer momento.
Configuración del método de notificación
Para informar de los resultados de tests a Datadog, debes configurar la biblioteca de JavaScript de Datadog:
We support auto-instrumentation for the following CI providers:
If you are using auto-instrumentation for one of these providers, you can skip the rest of the setup steps below.
Nota: La instrumentación automática no es compatible con los tests de Cypress. Para instrumentar tests de Cypress, sigue los steps (UI) / pasos (generic) de instrumentación manual descritos a continuación.
La modalidad agentless está disponible en las versiones de JavaScript de Datadog >= 2.5.0
If you are using a cloud CI provider without access to the underlying worker nodes, such as GitHub Actions or CircleCI, configure the library to use the Agentless mode. For this, set the following environment variables:
DD_CIVISIBILITY_AGENTLESS_ENABLED=true (Required)
Enables or disables Agentless mode. Default: false
DD_API_KEY (Required)
The Datadog API key used to upload the test results. Default: (empty)
Additionally, configure the Datadog site to which you want to send data.
DD_SITE (Required)
The Datadog site to upload results to. Default: datadoghq.com
If you are running tests on an on-premises CI provider, such as Jenkins or self-managed GitLab CI, install the Datadog Agent on each worker node by following the Agent installation instructions.
This is the recommended option as it allows you to automatically link test results to logs and underlying host metrics.
If you are using a Kubernetes executor, Datadog recommends using the Datadog Operator.
The operator includes Datadog Admission Controller which can automatically inject the tracer library into the build pods.
Note: If you use the Datadog Operator, there is no need to download and inject the tracer library since the Admission Controller can do this for you, so you can skip the corresponding step below.
However, you still need to make sure that your pods set the environment variables or command-line parameters necessary to enable Test Visibility.
If you are not using Kubernetes or can’t use the Datadog Admission Controller and the CI provider is using a container-based executor, set the DD_TRACE_AGENT_URL environment variable (which defaults to http://localhost:8126) in the build container running the tracer to an endpoint that is accessible from within that container. Note: Using localhost inside the build references the container itself and not the underlying worker node or any container where the Agent might be running in.
DD_TRACE_AGENT_URL includes the protocol and port (for example, http://localhost:8126) and takes precedence over DD_AGENT_HOST and DD_TRACE_AGENT_PORT, and is the recommended configuration parameter to configure the Datadog Agent’s URL for CI Visibility.
If you still have issues connecting to the Datadog Agent, use the Agentless Mode.
Note: When using this method, tests are not correlated with logs and infrastructure metrics.
Configura la variable de entorno NODE_OPTIONS en -r dd-trace/ci/init. Ejecuta tus tests como lo harías normalmente, opcionalmente especificando un nombre para tu sesión de tests con DD_TEST_SESSION_NAME:
NODE_OPTIONS="-r dd-trace/ci/init"DD_TEST_SESSION_NAME=unit-tests yarn test
Nota: Si configuras un valor para NODE_OPTIONS, asegúrate de que no sobrescriba -r dd-trace/ci/init. Esto se puede hacer mediante la cláusula ${NODE_OPTIONS:-}:
Añadir tags (etiquetas) personalizadas a los tests
Puedes añadir tags (etiquetas) personalizadas a tus tests mediante el span (tramo) activo actual:
it('sum function can sum',()=>{consttestSpan=require('dd-trace').scope().active()testSpan.setTag('team_owner','my_team')// test continues normally
// ...
})
Para crear filtros o campos group by para estas tags (etiquetas), primero debes crear facetas. Para obtener más información sobre el agregado de tags (etiquetas), consulta la sección Añadir tags (etiquetas) de la documentación sobre la instrumentación personalizada de Node.js.
Añadir medidas personalizadas a tests
Al igual que las tags (etiquetas), puedes añadir medidas personalizadas a tus tests mediante el span activo actual:
it('sum function can sum',()=>{consttestSpan=require('dd-trace').scope().active()testSpan.setTag('memory_allocations',16)// test continues normally
// ...
})
Mocha >=9.0.0 utiliza un primer enfoque de ESM para cargar archivos de tests. Configura NODE_OPTIONS en -r dd-trace/ci/init --import dd-trace/register.js para obtener una visibilidad completa de tus tests. Consulta Compatibilidad dedd-trace-js y ESM para obtener más información.
Configura la variable de entorno NODE_OPTIONS en -r dd-trace/ci/init. Ejecuta tus tests como lo harías normalmente, opcionalmente especificando un nombre para tu sesión de tests con DD_TEST_SESSION_NAME:
Nota: Si configuras un valor para NODE_OPTIONS, asegúrate de que no sobrescriba -r dd-trace/ci/init. Esto se puede hacer mediante la cláusula ${NODE_OPTIONS:-}:
test('user profile',async({page})=>{test.info().annotations.push({type:'DD_TAGS[test.memory.usage]',// DD_TAGS is mandatory and case sensitive
description:'low',});test.info().annotations.push({type:'DD_TAGS[test.task.id]',description:'41123',});// ...
});test('landing page',async({page})=>{test.info().annotations.push({type:'DD_TAGS[test.cpu.usage]',description:'high',});// ...
});
El formato de las anotaciones es el siguiente, donde $TAG_NAME y $TAG_VALUE son cadenas que representan el nombre y el valor de la tag (etiqueta), respectivamente:
Las medidas personalizadas también utilizan anotaciones personalizadas:
test('user profile',async({page})=>{test.info().annotations.push({type:'DD_TAGS[test.memory.allocations]',// DD_TAGS is mandatory and case sensitive
description:16,// this is a number
});});
El formato de las anotaciones es el siguiente, donde $TAG_NAME es una cadena que representa el nombre de la tag (etiqueta) y $TAG_VALUE es un número que representa el valor de la tag (etiqueta):
Nota: Los valores description en las anotaciones se escriben como cadenas. Los números también funcionan, pero puede ser necesario desactivar el error de escritura con // @ts-expect-error.
Importante: El prefijo DD_TAGS es obligatorio y distingue mayúsculas de minúsculas.
Integración de Playwright y RUM
Si la aplicación de navegador que se está comprobando se instrumenta mediante Monitorización del navegador, los resultados del test de Playwright y sus sesiones de navegador y repeticiones de sesión generadas con RUM se vinculan automáticamente. Para obtener más información, consulta la Guía de instrumentación de tests del navegador con RUM.
Configura la variable de entorno NODE_OPTIONS en -r dd-trace/ci/init. Ejecuta tus tests como lo harías normalmente, opcionalmente especificando un nombre para tu sesión de test con DD_TEST_SESSION_NAME:
Nota: Si estableces un valor para NODE_OPTIONS, asegúrate de que no sobrescriba la cláusula -r dd-trace/ci/init. This can be done using the ${NODE_OPTIONS:-}:
Añadir tags (etiquetas) personalizadas a los tests
Puedes añadir etiquetas personalizadas a tus tests con el tramo activo en ese momento:
When('the function is called',function(){conststepSpan=require('dd-trace').scope().active()testSpan.setTag('team_owner','my_team')// test continúa normalment
// ...
})
Para crear filtros o campos group by para estas etiquetas, primero debes crear facetas. Para obtener más información sobre la adición de etiquetas, consulta la sección Adición de etiquetas de la documentación de instrumentación personalizada de Node.js.
Añadir medidas personalizadas a los tests
También puedes añadir medidas personalizadas a tu test con el tramo que esté activo en ese momento:
When('the function is called',function(){conststepSpan=require('dd-trace').scope().active()testSpan.setTag('memory_allocations',16)// test continues normally
// ...
})
Añade la siguiente línea al nivel superior de tu supportFile:
cypress/support/e2e.js
// Tu código puede ir antes de esta línea
// require('./commands')
require('dd-trace/ci/cypress/support')// También compatible:
// import 'dd-trace/ci/cypress/support'
// Tu código también puede ir después de esta línea
// Cypress.Commands.add('login', (email, pw) => {})
Si utilizas otros complementos de Cypress, tu archivo cypress.config.js debe contener lo siguiente:
cypress.config.js
const{defineConfig}=require('cypress')module.exports=defineConfig({e2e:{setupNodeEvents(on,config){// tu código anterior está antes de esta línea
returnrequire('dd-trace/ci/cypress/plugin')(on,config)}}})
Evento after:run de Cypress
Datadog requiere el evento after:run de Cypress para funcionar, y Cypress no permite múltiples manejadores para ese evento. Si ya has definido manejadores para after:run, añade el manejador de Datadog manualmente al importar 'dd-trace/ci/cypress/after-run':
cypress.config.js
const{defineConfig}=require('cypress')module.exports=defineConfig({e2e:{setupNodeEvents(on,config){require('dd-trace/ci/cypress/plugin')(on,config)// otros complementos
on('after:run',(details)=>{// otros manejadores 'after:run'
// importante que se devuelva esta función
returnrequire('dd-trace/ci/cypress/after-run')(details)})}}})
Evento after:spec de Cypress
Datadog requiere el evento after:spec de Cypress para funcionar, y Cypress no permite múltiples manejadores para ese evento. Si ya has definido manejadores para after:spec, añade el manejador de Datadog manualmente al importar 'dd-trace/ci/cypress/after-spec':
cypress.config.js
const{defineConfig}=require('cypress')module.exports=defineConfig({e2e:{setupNodeEvents(on,config){require('dd-trace/ci/cypress/plugin')(on,config)// otros complementos
on('after:spec',(...args)=>{// otros manejadores 'after:spec'
// Importante que se devuelva esta función
// Importante que todos los argumentos se pasen
returnrequire('dd-trace/ci/cypress/after-spec')(...args)})}}})
Cypress antes de la versión 10
Estas son las instrucciones si estás utilizando una versión anterior a cypress@10. Consulta la documentación de Cypress para obtener más información sobre la migración a una versión más reciente.
Establece pluginsFile en "dd-trace/ci/cypress/plugin", por ejemplo, a través de cypress.json:
cypress.json
{"pluginsFile":"dd-trace/ci/cypress/plugin"}
Si ya has definido un pluginsFile, inicializa la instrumentación con:
cypress/plugins/index.js
module.exports=(on,config)=>{// tu código anterior está antes de esta línea
returnrequire('dd-trace (traza)/ci/cypress/plugin')(on,config)}
Añade la siguiente línea al nivel superior de tu supportFile:
cypress/support/index.js
// Tu código puede estar antes de esta línea
// require('./commands')
require('dd-trace/ci/cypress/support')// Tu código también puede estar después de esta línea
// Cypress.Commands.add('login', (email, pw) => {})
Evento after:run de Cypress
Datadog requiere el evento after:run de Cypress para funcionar, y Cypress no permite múltiples manejadores para ese evento. Si ya has definido manejadores para after:run, añade el manejador de Datadog manualmente al importar 'dd-trace/ci/cypress/after-run':
cypress/plugins/index.js
module.exports=(on,config)=>{// tu código anterior va antes de esta línea
require('dd-trace/ci/cypress/plugin')(on,config)on('after:run',(details)=>{// otros manejadores 'after:run'
// importante que se devuelva esta llamada a la función
returnrequire('dd-trace/ci/cypress/after-run')(details)})}
Evento after:spec de Cypress
Datadog requiere el evento after:spec de Cypress para funcionar, y Cypress no permite múltiples manejadores para ese evento. Si ya has definido manejadores para after:spec, añade el manejador de Datadog manualmente al importar 'dd-trace/ci/cypress/after-spec':
cypress/plugins/index.js
module.exports=(on,config)=>{// tu código anterior va antes de esta línea
require('dd-trace/ci/cypress/plugin')(on,config)on('after:spec',(...args)=>{// otros manejadores 'after:spec'
// Importante que se devuelva esta llamada a la función
// Importante que todos los argumentos se pasen
returnrequire('dd-trace/ci/cypress/after-run')(...args)})}
Ejecuta tus tests como lo harías normalmente, especificando opcionalmente un nombre para tu sesión de test con DD_TEST_SESSION_NAME:
DD_TEST_SESSION_NAME=ui-tests yarn test:ui
Añadir etiquetas (tags) personalizadas a los tests
Para añadir información adicional a tus tests, como el propietario del equipo, utiliza cy.task('dd:addTags', { yourTags: 'here' }) en tu testo hooks.
Por ejemplo:
beforeEach(()=>{cy.task('dd:addTags',{'before.each':'certain.information'})})it('renders a hello world',()=>{cy.task('dd:addTags',{'team.owner':'ui'})cy.get('.hello-world').should('have.text','Hello World')})
Para crear filtros o campos group by para estas etiquetas, primero debes crear facetas. Para más información sobre cómo añadir etiquetas, consulta la sección Añadir etiquetas de la documentación de instrumentación personalizada de Node.js.
Añadir medidas personalizadas a los tests
Para añadir información adicional a tus tests, como asignaciones de memoria, utiliza cy.task('dd:addTags', { yourNumericalTags: 1 }) en tu test o hooks.
Por ejemplo:
it('renders a hello world',()=>{cy.task('dd:addTags',{'memory_allocations':16})cy.get('.hello-world').should('have.text','Hello World')})
Si la aplicación de navegador que se está probando se instrumenta con la Monitorización de navegador, los resultados de los tests de Cypress y sus sesiones de navegador RUM generadas y las repeticiones de sesión se vinculan automáticamente. Para obtener más información, consulta la guía para Instrumentar tus tests de navegador con RUM.
Nota: Vitest es ESM primero, por lo que tu configuración es diferente de otros frameworks de tests.
vitest y dd-trace requieren Node.js>=18.19 o Node.js>=20.6 para funcionar.
Configura la variable de entorno NODE_OPTIONS en --import dd-trace/register.js -r dd-trace/ci/init. Ejecuta tus tests como lo harías normalmente, opcionalmente especificando un nombre para tu sesión de test con DD_TEST_SESSION_NAME:
Nota: Si estableces un valor para NODE_OPTIONS, asegúrate de que no sobrescriba la cláusula --import dd-trace/register.js -r dd-trace/ci/init. This can be done using the ${NODE_OPTIONS:-}:
Nota: Esto no funciona porque NODE_OPTIONS es interpretado por cada proceso de nodo, incluido npm install. Si intentas importar dd-trace/ci/init antes de que esté instalado, este paso falla.
Asegúrate de que la variable de entorno NODE_OPTIONS solo está configurada en el proceso que ejecuta los tests.
En concreto, evita definir NODE_OPTIONS en la configuración de variables globales de entorno en la definición de tu proceso o trabajo.
Con Yarn 2 o posterior
Si utilizas yarn>=2 y un archivo .pnp.cjs, también puedes obtener el mismo error:
Error: Cannot find module 'dd-trace/ci/init'
Puedes solucionarlo configurando NODE_OPTIONS de la siguiente manera:
NODE_OPTIONS="-r $(pwd)/.pnp.cjs -r dd-trace/ci/init" yarn test
Informar sobre la cobertura del código
Cuando los tests se instrumentan con Istambul, el rastreador de Datadog (v3.20.0 o posterior) informa de ello en la etiqueta test.code_coverage.lines_pct para tus sesiones de test.
Puedes ver la evolución de la cobertura de los tests en la pestaña Coverage (Cobertura) de una sesión de tests.
A continuación, se muestra una lista de los ajustes más importantes de configuración que se pueden utilizar con el rastreador.
test_session.name
Se utiliza para identificar un grupo de tests, como integration-tests, unit-tests o smoke-tests. Variable de entorno: DD_TEST_SESSION_NAME Predeterminado: (nombre del job (generic) de integración continua + comando de test) Ejemplo: unit-tests, integration-tests, smoke-tests
service
nombre del servicio o biblioteca en proceso de test. **Variable de entorno **: DD_SERVICE Por defecto: (nombre del framework de test) Ejemplo: my-ui
env
nombre del entorno donde se están ejecutando los tests. **Variable de entorno **: DD_ENV Por defecto: none Ejemplos: local, ci
url
URL del Datadog Agent para la recopilación de trazas con el formato http://hostname:port. Variable de entorno: DD_TRACE_AGENT_URL Por defecto: http://localhost:8126
Datadog uses Git information for visualizing your test results and grouping them by repository, branch, and commit. Git metadata is automatically collected by the test instrumentation from CI provider environment variables and the local .git folder in the project path, if available.
If you are running tests in non-supported CI providers or with no .git folder, you can set the Git information manually using environment variables. These environment variables take precedence over any auto-detected information. Set the following environment variables to provide Git information:
DD_GIT_REPOSITORY_URL
URL of the repository where the code is stored. Both HTTP and SSH URLs are supported. Example: git@github.com:MyCompany/MyApp.git, https://github.com/MyCompany/MyApp.git
DD_GIT_BRANCH
Git branch being tested. Leave empty if providing tag information instead. Example: develop
DD_GIT_TAG
Git tag being tested (if applicable). Leave empty if providing branch information instead. Example: 1.0.1
DD_GIT_COMMIT_SHA
Full commit hash. Example: a18ebf361cc831f5535e58ec4fae04ffd98d8152
DD_GIT_COMMIT_MESSAGE
Commit message. Example: Set release number
DD_GIT_COMMIT_AUTHOR_NAME
Commit author name. Example: John Smith
DD_GIT_COMMIT_AUTHOR_EMAIL
Commit author email. Example: john@example.com
DD_GIT_COMMIT_AUTHOR_DATE
Commit author date in ISO 8601 format. Example: 2021-03-12T16:00:28Z
DD_GIT_COMMIT_COMMITTER_NAME
Commit committer name. Example: Jane Smith
DD_GIT_COMMIT_COMMITTER_EMAIL
Commit committer email. Example: jane@example.com
DD_GIT_COMMIT_COMMITTER_DATE
Commit committer date in ISO 8601 format. Example: 2021-03-12T16:00:28Z
API para tests manuales
Nota: La API de tests manuales está disponible a partir de las versiones 5.23.0 y 4.47.0 de dd-trace.
Si utilizas Jest, Mocha, Cypress, Playwright, Cucumber o Vitest, no utilices la API de tests manuales, ya que Test Optimization (optimización de tests) los instrumenta automáticamente y envía los resultados de los tests a Datadog. La API de test manual es incompatible con los frameworks de tests ya admitidos.
Utiliza la API de tests manuales solo si utilizas un framework de test no compatible o tienes un mecanismo de test diferente.
La API de tests manuales aprovecha el módulo node:diagnostics_channel de Node.js y se basa en canales en los que se puede publicar:
const{channel}=require('node:diagnostics_channel')const{describe,test,beforeEach,afterEach,assert}=require('my-custom-test-framework')consttestStartCh=channel('dd-trace:ci:manual:test:start')consttestFinishCh=channel('dd-trace:ci:manual:test:finish')consttestSuite=__filenamedescribe('can run tests',()=>{beforeEach((testName)=>{testStartCh.publish({testName,testSuite})})afterEach((status,error)=>{testFinishCh.publish({status,error})})test('first test will pass',()=>{assert.equal(1,1)})})
Canal de inicio del test
Toma este canal por su ID dd-trace:ci:manual:test:start para publicar que se está iniciando un test. Un buen lugar para hacer esto es un hook beforeEach o similar.
const{channel}=require('node:diagnostics_channel')consttestStartCh=channel('dd-trace:ci:manual:test:start')// ... el código para tu framework de test va aquí
beforeEach(()=>{consttestDefinition={testName:'a-string-that-identifies-this-test',testSuite:'what-suite-this-test-is-from.js'}testStartCh.publish(testDefinition)})// el código para tu framework de test continúa aquí ...
La carga útil que se va a publicar tiene los atributos testName y testSuite, ambos cadenas, que identifican el test que está a punto de comenzar.
Canal de finalización del test
Toma este canal por su ID dd-trace:ci:manual:test:finish para publicar que se está finalizando un test. Un buen lugar para hacer esto es un hook afterEach o similar.
const{channel}=require('node:diagnostics_channel')consttestFinishCh=channel('dd-trace:ci:manual:test:finish')// ... el código para tu framework de test va aquí
afterEach(()=>{consttestStatusPayload={status:'fail',error: newError('assertion error')}testStartCh.publish(testStatusPayload)})// el código para tu framework de test continúa aquí ...
La carga útil que se va a publicar tiene los atributos status y error:
status es una cadena que toma uno de tres valores:
'pass' cuando se supera un test.
'fail' cuando falla un test.
'skip' cuando se ha omitido un test.
error es un objeto Error que contiene la razón por la que ha fallado un test.
Añadir etiquetas de canal
Toma este canal por su ID dd-trace:ci:manual:test:addTags para publicar que un test necesita etiquetas personalizadas. Esto puede hacerse dentro de la función de test:
const{channel}=require('node:diagnostics_channel')consttestAddTagsCh=channel('dd-trace:ci:manual:test:addTags')// ... el código para tu framework de test va aquí
test('can sum',()=>{testAddTagsCh.publish({'test.owner':'my-team','number.assertions':3})constresult=sum(2,1)assert.equal(result,3)})// el código para tu framework de test continúa aquí ...
La carga útil que se publica es un diccionario <string, string|number> de etiquetas o medidas que se añaden al test.
Ejecutar los tests
Cuando los canales de inicio y fin del test estén en tu código, ejecuta tu framework de test como lo haces normalmente, incluyendo las siguientes variables de entorno:
Los tests de navegador ejecutados con mocha, jest, cucumber, cypress, playwright y vitest son instrumentados por dd-trace-js, pero la visibilidad de la sesión del navegador en sí no se proporciona por defecto (por ejemplo, llamadas de red, acciones del usuario, cargas de páginas, etc.).
Si deseas tener visibilidad del proceso del navegador, considera el uso de RUM y repetición de sesión. Cuando se utiliza Cypress o Playwright, los resultados de test y sus sesiones de navegador de RUM generadas y las repeticiones de sesión se vinculan automáticamente. Para obtener más información, consulta la Guía para Instrumentar tus tests del navegador con RUM.
Modo interactivo de Cypress
El modo interactivo de Cypress (al que puedes entrar ejecutando cypress open) no es compatible con Test Optimization (optimización de tests) porque algunos eventos de cypress, como before:run, no se disparan. Si deseas probarlo de todas formas, pasa experimentalInteractiveRunEvents: true al archivo de configuración de cypress.
La opción –forceExit de Jest puede provocar la pérdida de datos. Datadog intenta enviar datos inmediatamente después de que finalicen tus tests, pero el cierre abrupto del proceso puede hacer que fallen algunas solicitudes. Utiliza --forceExit con precaución.
--exit de Mocha
La opción –exit de Mocha puede provocar la pérdida de datos. Datadog intenta enviar los datos inmediatamente después de que finalicen tus tests, pero el cierre abrupto del proceso puede hacer que fallen algunas solicitudes. Utiliza --exit con precaución.
constforEach=require('mocha-each');forEach([[1,2,3],[3,4,7]]).it('adds %i and %i then returns %i',(a,b,expected)=>{expect(a+b).to.equal(expected)});
Cuando se utiliza este enfoque, tanto el framework de testing como test Optimization (optimización de tests) pueden distinguir sus tests.
Nombre de la sesión de test DD_TEST_SESSION_NAME
Utiliza DD_TEST_SESSION_NAME para definir el nombre de la sesión de test y del grupo de tests relacionado. Algunos ejemplos de valores para esta etiqueta serían:
unit-tests
integration-tests
smoke-tests
flaky-tests
ui-tests
backend-tests
Si no se especifica DD_TEST_SESSION_NAME, el valor predeterminado utilizado es una combinación de:
Nombre del job (generic) de CI
Comando utilizado para ejecutar los tests (como yarn test)
El nombre de la sesión de tests debe ser único dentro de un repositorio para ayudarte a distinguir diferentes grupos de tests.
Cuándo utilizar DD_TEST_SESSION_NAME
Hay un conjunto de parámetros que Datadog comprueba para establecer la correspondencia entre las sesiones de test. El comando de test utilizado para ejecutar los tests es uno de ellos. Si el comando de test contiene una cadena que cambia en cada ejecución, como una carpeta temporal, Datadog considera que las sesiones no están relacionadas entre sí. Por ejemplo:
yarn test --temp-dir=/var/folders/t1/rs2htfh55mz9px2j4prmpg_c0000gq/T