Ce produit n'est pas pris en charge par le site Datadog que vous avez sélectionné. ().

Compatibilité

Framework de testVersionNotes
Jest>= 28.0.0Seuls jsdom (dans le package jest-environment-jsdom) et node (dans le package jest-environment-node) sont pris en charge en tant qu’environnements de test. Les environnements personnalisés comme @jest-runner/electron/environment dans jest-electron-runner ne sont pas pris en charge.

Seul jest-circus est pris en charge en tant que testRunner.

test.concurrent est pris en charge à partir de dd-trace>=6.1.0.
Mocha>= 8.0.0
Cucumber>= 7.0.0
Cypress>= 12.0.0
Playwright>= 1.38.0
Vitest>= 1.6.0test.concurrent est pris en charge à partir de dd-trace>=6.1.0. Le mode navigateur est pris en charge à partir de dd-trace>=6.8.0.
WebdriverIO>= 9.0.0Pris en charge avec les adaptateurs de framework Mocha et Jasmine à partir de dd-trace>=6.10.0.

dd-trace v6 nécessite Node.js 22 ou une version ultérieure.

Framework de testVersionNotes
Jest>= 24.8.0Seuls jsdom (dans le package jest-environment-jsdom) et node (dans le package jest-environment-node) sont pris en charge en tant qu’environnements de test. Les environnements personnalisés comme @jest-runner/electron/environment dans jest-electron-runner ne sont pas pris en charge.

Seul jest-circus est pris en charge en tant que testRunner.

test.concurrent est pris en charge à partir de dd-trace>=5.112.0.
Mocha>= 5.2.0
Cucumber>= 7.0.0
Cypress>= 6.7.0
Playwright>= 1.18.0
Vitest>= 1.6.0Pris en charge à partir de dd-trace>=5.18.0. test.concurrent est pris en charge à partir de dd-trace>=5.112.0. Le mode navigateur est pris en charge à partir de dd-trace>=5.119.0.
WebdriverIO>= 9.0.0Pris en charge avec les adaptateurs de framework Mocha et Jasmine à partir de dd-trace>=5.121.0.

L’instrumentation fonctionne à l’exécution, donc tous les transpileurs tels que TypeScript, Webpack ou Babel sont pris en charge sans configuration supplémentaire.

Configuration de la méthode de rapport

Pour signaler les résultats des tests à Datadog, vous devez configurer la bibliothèque JavaScript Datadog :

We support auto-instrumentation for the following CI providers:

CI ProviderAuto-Instrumentation method
GitHub ActionsDatadog Test Visibility Github Action
JenkinsUI-based configuration with Datadog Jenkins plugin
GitLabDatadog Test Visibility GitLab Script
CircleCIDatadog Test Visibility CircleCI Orb

Auto-instrumentation runs on the CI executor and does not automatically apply to tests in a separate container. Before using it for containerized tests, see Tests in Containers.

If the auto-instrumentation step configures the process that runs your tests, you can skip the rest of the setup steps below.

Remarque : l'auto-instrumentation n'est pas prise en charge pour les tests Cypress. Pour instrumenter les tests Cypress, suivez les étapes d'instrumentation manuelle décrites ci-dessous.

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:

Set these variables before starting the test process. For parallel test runners, set them on the parent process so every worker inherits them.

DD_CIVISIBILITY_AGENTLESS_ENABLED=true selects Agentless mode. DD_API_KEY provides authentication but does not enable Agentless mode.

DD_CIVISIBILITY_AGENTLESS_ENABLED=true (Required for Agentless mode)
Enables Agentless mode to send test results directly to Datadog.
Default: false
DD_API_KEY (Required for Agentless mode)
The Datadog API key used to authenticate test result uploads.
Default: (empty)

If you use a Datadog site other than US1, set the following variable:

DD_SITE (Optional for Agentless mode)
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.

Installation du traceur JavaScript

Pour installer le JavaScript Tracer, exécutez :

yarn add --dev dd-trace

Pour plus d’informations, consultez la documentation d’installation du JavaScript Tracer.

Instrumentez vos tests

Définissez la variable d’environnement NODE_OPTIONS sur -r dd-trace/ci/init. Exécutez vos tests comme vous le feriez normalement, en spécifiant éventuellement un nom pour votre session de test avec DD_TEST_SESSION_NAME :

NODE_OPTIONS="-r dd-trace/ci/init" DD_TEST_SESSION_NAME=unit-tests yarn test

Remarque : si vous définissez une valeur pour NODE_OPTIONS, assurez-vous qu’elle n’écrase pas -r dd-trace/ci/init. Cela peut être fait en utilisant la clause ${NODE_OPTIONS:-} :

package.json

{
  "scripts": {
    "test": "NODE_OPTIONS=\"--max-old-space-size=12288 ${NODE_OPTIONS:-}\" jest"
  }
}

Ajout de tags personnalisés aux tests

Vous pouvez ajouter des tags personnalisés à vos tests en utilisant la span actuellement active :

  it('sum function can sum', () => {
    const testSpan = require('dd-trace').scope().active()
    testSpan.setTag('team_owner', 'my_team')
    // test continues normally
    // ...
  })

Pour créer des filtres ou des champs group by pour ces tags, vous devez d’abord créer des facettes. Pour plus d’informations sur l’ajout de tags, consultez la section Adding Tags de la documentation sur l’instrumentation personnalisée de Node.js.

Ajout de mesures personnalisées aux tests

Tout comme pour les tags, vous pouvez ajouter des mesures personnalisées à vos tests en utilisant le span actif :

  it('sum function can sum', () => {
    const testSpan = require('dd-trace').scope().active()
    testSpan.setTag('memory_allocations', 16)
    // test continues normally
    // ...
  })

Pour plus d’informations sur les mesures personnalisées, consultez le guide d’ajout de mesures personnalisées.

Mocha ECMAScript modules (ESM)

Mocha >=9.0.0 utilise une approche axée sur l’ESM pour charger les fichiers de test. Définissez NODE_OPTIONS sur -r dd-trace/ci/init --import dd-trace/register.js pour obtenir une visibilité complète sur vos tests. Consultez dd-trace-js ESM support pour plus d’informations.

Définissez la variable d’environnement NODE_OPTIONS sur -r dd-trace/ci/init. Exécutez vos tests comme vous le feriez normalement, en spécifiant éventuellement un nom pour votre session de test avec DD_TEST_SESSION_NAME :

NODE_OPTIONS="-r dd-trace/ci/init" DD_TEST_SESSION_NAME=e2e-tests yarn test:e2e

Remarque : si vous définissez une valeur pour NODE_OPTIONS, assurez-vous qu’elle n’écrase pas -r dd-trace/ci/init. Cela peut être fait en utilisant la clause ${NODE_OPTIONS:-} :

package.json

{
  "scripts": {
    "test": "NODE_OPTIONS=\"--max-old-space-size=12288 ${NODE_OPTIONS:-}\" jest"
  }
}

Ajout de tags personnalisés aux tests

Vous pouvez ajouter des tags personnalisés à vos tests en utilisant la span actuellement active :

test('user profile', async ({ page }) => {
  const testSpan = require('dd-trace').scope().active()
  testSpan.setTag('team_owner', 'my_team')
  // ...
})

test('landing page', async ({ page }) => {
  const testSpan = require('dd-trace').scope().active()
  testSpan.setTag('test.cpu.usage', 'high')
  // ...
})

Pour créer des filtres ou des champs group by pour ces tags, vous devez d’abord créer des facettes. Pour plus d’informations sur l’ajout de tags, consultez la section Adding Tags de la documentation sur l’instrumentation personnalisée de Node.js.

Ajout de mesures personnalisées aux tests

Vous pouvez également ajouter des mesures personnalisées à vos tests en utilisant le span actif :

test('user profile', async ({ page }) => {
  const testSpan = require('dd-trace').scope().active()
  testSpan.setTag('memory_allocations', 16)
  // ...
})

Pour plus d’informations sur les mesures personnalisées, consultez le guide d’ajout de mesures personnalisées.

Intégration Playwright - RUM

Si l’application de navigateur testée est instrumentée à l’aide de Browser Monitoring, les résultats des tests Playwright et leurs RUM browser sessions et session replays générées sont automatiquement liés. Pour plus d’informations, consultez le guide Instrumenter vos tests Browser avec RUM.

Téléversez les captures d’écran d’échec de test

Lorsqu’elle est activée, Test Optimization télécharge les captures d’écran que Playwright capture lorsqu’un test échoue. Affichez les captures d’écran dans l’onglet Media du panneau latéral des détails de test de Test Optimization. Utilisez-les pour inspecter l’état du navigateur au moment de l’échec.

Une capture d'écran d'échec Playwright affichée dans l'onglet Média du panneau latéral des détails de test de Test Optimization.

Utilisez dd-trace v5.116.0 ou version ultérieure sur la ligne de version v5, ou dd-trace v6.5.0 ou version ultérieure sur la ligne de version v6.

Pour activer les téléchargements de captures d’écran, définissez la variable d’environnement DD_TEST_FAILURE_SCREENSHOTS_ENABLED sur 1. Dans votre configuration Playwright, définissez screenshot sous use sur l’une des valeurs suivantes :

  • 'on' : Capturez une capture d’écran après chaque test.
  • 'only-on-failure' : Capturez une capture d’écran après chaque échec de test.
  • 'on-first-failure' : Capturez une capture d’écran après le premier échec de chaque test.

Remarque : Si vous utilisez 'on', Test Optimization ne télécharge que les captures d’écran des tests ayant échoué.

Définissez la variable d’environnement NODE_OPTIONS sur -r dd-trace/ci/init. Exécutez vos tests comme vous le feriez normalement, en spécifiant éventuellement un nom pour votre session de test avec DD_TEST_SESSION_NAME :

NODE_OPTIONS="-r dd-trace/ci/init" DD_TEST_SESSION_NAME=integration-tests yarn test:integration

Remarque : si vous définissez une valeur pour NODE_OPTIONS, assurez-vous qu’elle n’écrase pas -r dd-trace/ci/init. Cela peut être fait en utilisant la clause ${NODE_OPTIONS:-} :

package.json

{
  "scripts": {
    "test": "NODE_OPTIONS=\"--max-old-space-size=12288 ${NODE_OPTIONS:-}\" jest"
  }
}

Ajout de tags personnalisés aux tests

Vous pouvez ajouter des tags personnalisés à votre test en récupérant la span active :

  When('the function is called', function () {
    const stepSpan = require('dd-trace').scope().active()
    testSpan.setTag('team_owner', 'my_team')
    // test continues normally
    // ...
  })

Pour créer des filtres ou des champs group by pour ces tags, vous devez d’abord créer des facettes. Pour plus d’informations sur l’ajout de tags, consultez la section Adding Tags de la documentation sur l’instrumentation personnalisée de Node.js.

Ajout de mesures personnalisées aux tests

Vous pouvez également ajouter des mesures personnalisées à votre test en utilisant le span actif :

  When('the function is called', function () {
    const stepSpan = require('dd-trace').scope().active()
    testSpan.setTag('memory_allocations', 16)
    // test continues normally
    // ...
  })

Pour plus d’informations sur les mesures personnalisées, consultez le guide d’ajout de mesures personnalisées.

Cypress version 10 ou ultérieure

Utilisez la documentation de l’API Cypress pour apprendre à utiliser les plugins pour cypress>=10.

Dans votre fichier cypress.config.js, définissez ce qui suit :

cypress.config.js

const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    setupNodeEvents: require('dd-trace/ci/cypress/plugin'),
    supportFile: 'cypress/support/e2e.js'
  }
})

Ajoutez la ligne suivante au niveau supérieur de votre supportFile :

cypress/support/e2e.js

// Your code can be before this line
// require('./commands')
require('dd-trace/ci/cypress/support')
// Also supported:
// import 'dd-trace/ci/cypress/support'
// Your code can also be after this line
// Cypress.Commands.add('login', (email, pw) => {})

Si vous utilisez d’autres plugins Cypress, votre fichier cypress.config.js doit contenir ce qui suit :

cypress.config.js

const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // your previous code is before this line
      return require('dd-trace/ci/cypress/plugin')(on, config)
    }
  }
})

Événement Cypress after:run

Datadog nécessite l’événement Cypress after:run pour fonctionner, et Cypress n’autorise pas plusieurs gestionnaires pour cet événement. Si vous avez déjà défini des gestionnaires pour after:run, ajoutez manuellement le gestionnaire Datadog en important '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)
      // other plugins
      on('after:run', (details) => {
        // other 'after:run' handlers
        // important that this function call is returned
        return require('dd-trace/ci/cypress/after-run')(details)
      })
    }
  }
})

Événement Cypress after:spec

Datadog nécessite l’événement Cypress after:spec pour fonctionner, et Cypress n’autorise pas plusieurs gestionnaires pour cet événement. Si vous avez déjà défini des gestionnaires pour after:spec, ajoutez manuellement le gestionnaire Datadog en important '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)
      // other plugins
      on('after:spec', (...args) => {
        // other 'after:spec' handlers
        // Important that this function call is returned
        // Important that all the arguments are passed
        return require('dd-trace/ci/cypress/after-spec')(...args)
      })
    }
  }
})

Exécutez vos tests comme vous le feriez normalement, en spécifiant éventuellement un nom pour votre session de test avec DD_TEST_SESSION_NAME :

DD_TEST_SESSION_NAME=ui-tests yarn test:ui

Ajout de tags personnalisés aux tests

Pour ajouter des informations supplémentaires à vos tests, telles que le propriétaire de l’équipe, utilisez cy.task('dd:addTags', { yourTags: 'here' }) dans votre test ou vos hooks.

Exemple :

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')
})

Pour créer des filtres ou des champs group by pour ces tags, vous devez d’abord créer des facettes. Pour plus d’informations sur l’ajout de tags, consultez la section Adding Tags de la documentation sur l’instrumentation personnalisée Node.js.

Ajout de mesures personnalisées aux tests

Pour ajouter des mesures personnalisées à vos tests, telles que les allocations de mémoire, utilisez cy.task('dd:addTags', { yourNumericalTags: 1 }) dans votre test ou vos hooks.

Exemple :

it('renders a hello world', () => {
  cy.task('dd:addTags', {
    'memory_allocations': 16
  })
  cy.get('.hello-world')
    .should('have.text', 'Hello World')
})

Pour plus d’informations sur les mesures personnalisées, consultez le guide d’ajout de mesures personnalisées.

Intégration Cypress - RUM

Si l’application de navigateur testée est instrumentée à l’aide de Browser Monitoring, les résultats des tests Cypress ainsi que les sessions de navigateur RUM et les relectures de session générées sont automatiquement liés. Pour plus d’informations, consultez le guide d’instrumentation de vos tests de navigateur avec RUM.

Téléversez les captures d’écran d’échec de test

Lorsqu’elle est activée, Test Optimization téléverse les captures d’écran que Cypress prend lorsqu’un test échoue. Elles apparaissent dans l’onglet Media du panneau latéral des détails de test de Test Optimization. Utilisez-les pour inspecter l’état du navigateur au moment de l’échec.

Une capture d'écran d'échec Cypress affichée dans l'onglet Media du panneau latéral des détails de test de Test Optimization.

Utilisez dd-trace v5.112.0 ou version ultérieure sur la ligne de version v5, ou dd-trace v6.1.0 ou version ultérieure sur la ligne de version v6.

Pour activer les téléchargements de captures d’écran, définissez la variable d’environnement DD_TEST_FAILURE_SCREENSHOTS_ENABLED sur 1. Dans votre configuration Cypress, assurez-vous que screenshotOnRunFailure est défini sur true (la valeur par défaut).

Remarque : Vitest est prioritairement ESM, sa configuration est donc différente de celle des autres frameworks de test.

Utilisez une version de Node.js prise en charge par votre version majeure de dd-trace pour l’instrumentation Vitest :

  • dd-trace v5 nécessite Node.js 18.19+ ou Node.js 20.6+.
  • dd-trace v6 nécessite Node.js 22 ou une version ultérieure.

Définissez la variable d’environnement NODE_OPTIONS sur --import dd-trace/register.js -r dd-trace/ci/init. Exécutez vos tests comme vous le feriez normalement, en spécifiant éventuellement un nom pour votre session de test avec DD_TEST_SESSION_NAME :

NODE_OPTIONS="--import dd-trace/register.js -r dd-trace/ci/init" DD_TEST_SESSION_NAME=smoke-tests yarn test:smoke

Remarque : si vous définissez une valeur pour NODE_OPTIONS, assurez-vous qu’elle n’écrase pas --import dd-trace/register.js -r dd-trace/ci/init. Cela peut être fait en utilisant la clause ${NODE_OPTIONS:-} :

package.json

{
  "scripts": {
    "test": "NODE_OPTIONS=\"--max-old-space-size=12288 ${NODE_OPTIONS:-}\" vitest run"
  }
}

Ajout de tags ou de mesures personnalisés aux tests

Vous pouvez ajouter des tags personnalisés à vos tests en utilisant la span actuellement active :

import tracer from 'dd-trace'
import { expect, test } from 'vitest'

test('sum function can sum', () => {
  const testSpan = tracer.scope().active()
  testSpan.setTag('team_owner', 'my_team')

  expect(1 + 2).toBe(3)
})

Pour créer des filtres ou des champs group by pour ces tags, vous devez d’abord créer des facettes. Pour plus d’informations sur l’ajout de tags, consultez la section Adding Tags de la documentation sur l’instrumentation personnalisée de Node.js.

Vous pouvez également ajouter des mesures personnalisées à vos tests en utilisant le span actif :

import tracer from 'dd-trace'
import { expect, test } from 'vitest'

test('sum function can sum', () => {
  const testSpan = tracer.scope().active()
  testSpan.setTag('memory_allocations', 16)

  expect(1 + 2).toBe(3)
})

Pour plus d’informations sur les mesures personnalisées, consultez le guide d’ajout de mesures personnalisées.

Utilisez une version de Node.js prise en charge par votre dd-trace version majeure pour l’instrumentation WebdriverIO :

  • dd-trace v5 nécessite Node.js 18.19+ ou Node.js 20.6+.
  • dd-trace v6 nécessite Node.js 22 ou une version ultérieure.

Définissez la variable d’environnement NODE_OPTIONS sur --import dd-trace/register.js -r dd-trace/ci/init. Exécutez vos tests comme vous le feriez normalement, en spécifiant éventuellement un nom pour votre session de test avec DD_TEST_SESSION_NAME :

NODE_OPTIONS="--import dd-trace/register.js -r dd-trace/ci/init" DD_TEST_SESSION_NAME=e2e-tests yarn test:e2e

Remarque : si vous définissez une valeur pour NODE_OPTIONS, assurez-vous qu’elle n’écrase pas --import dd-trace/register.js -r dd-trace/ci/init. Cela peut être fait en utilisant la clause ${NODE_OPTIONS:-} :

package.json

{
  "scripts": {
    "test:e2e": "NODE_OPTIONS=\"--max-old-space-size=12288 ${NODE_OPTIONS:-}\" wdio run ./wdio.conf.js"
  }
}

Ajout de tags ou de mesures personnalisés aux tests

Vous pouvez ajouter des tags personnalisés à vos tests en utilisant la span actuellement active :

import tracer from 'dd-trace'

describe('home page', () => {
  it('displays the heading', async () => {
    const testSpan = tracer.scope().active()
    testSpan.setTag('team_owner', 'my_team')

    await browser.url('/')
    await expect($('h1')).toBeDisplayed()
  })
})

Pour créer des filtres ou des champs group by pour ces tags, vous devez d’abord créer des facettes. Pour plus d’informations sur l’ajout de tags, consultez la section Adding Tags de la documentation sur l’instrumentation personnalisée de Node.js.

Vous pouvez également ajouter des mesures personnalisées à vos tests en utilisant le span actif :

import tracer from 'dd-trace'

describe('home page', () => {
  it('displays the heading', async () => {
    const testSpan = tracer.scope().active()
    testSpan.setTag('memory_allocations', 16)

    await browser.url('/')
    await expect($('h1')).toBeDisplayed()
  })
})

Pour plus d’informations sur les mesures personnalisées, consultez le guide d’ajout de mesures personnalisées.

Comment corriger les erreurs « Cannot find module ‘dd-trace/ci/init’ »

Lorsque vous utilisez dd-trace, vous pourriez rencontrer le message d’erreur suivant :

 Error: Cannot find module 'dd-trace/ci/init'

Cela peut être dû à une utilisation incorrecte de NODE_OPTIONS.

Par exemple, si votre GitHub Action ressemble à ceci :

jobs:
  my-job:
    name: Run tests
    runs-on: ubuntu-latest
    # Invalid NODE_OPTIONS
    env:
      NODE_OPTIONS: -r dd-trace/ci/init
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Install node
        uses: actions/setup-node@v3
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test

Remarque : Cela ne fonctionne pas car NODE_OPTIONS sont interprétés par chaque processus de nœud, y compris npm install. Si vous essayez d’importer dd-trace/ci/init avant qu’il ne soit installé, cette étape échoue.

Votre GitHub Action devrait plutôt ressembler à ceci :

jobs:
  my-job:
    name: Run tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Install node
        uses: actions/setup-node@v3
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test
        env:
          NODE_OPTIONS: -r dd-trace/ci/init

Suivez ces bonnes pratiques :

  • Assurez-vous que la variable d’environnement NODE_OPTIONS est uniquement définie sur le processus exécutant les tests.
  • Évitez spécifiquement de définir NODE_OPTIONS dans les paramètres des variables d’environnement globales de votre pipeline ou de votre définition de job.

Utilisation de Yarn 2 ou version ultérieure

Si vous utilisez yarn>=2 et un fichier .pnp.cjs, vous pourriez également obtenir la même erreur :

 Error: Cannot find module 'dd-trace/ci/init'

Vous pouvez le corriger en définissant NODE_OPTIONS sur ce qui suit :

NODE_OPTIONS="-r $(pwd)/.pnp.cjs -r dd-trace/ci/init" yarn test

Rapport de couverture de code

Lorsque les tests sont instrumentés avec Istanbul, le traceur Datadog (v3.20.0 ou ultérieure) le signale sous le tag test.code_coverage.lines_pct pour vos sessions de test.

Vous pouvez voir l’évolution de la couverture des tests dans l’onglet Coverage d’une session de test.

Pour plus d’informations, consultez Code Coverage.

Paramètres de configuration

Voici une liste des paramètres de configuration les plus importants qui peuvent être utilisés avec le SDK.

test_session.name
Utilisez-le pour identifier un groupe de tests, tels que integration-tests, unit-tests ou smoke-tests.
Variable d’environnement: DD_TEST_SESSION_NAME
Par défaut: Pour dd-trace v6, l’invocation du framework, telle que jest, mocha, playwright test ou cucumber-js. Pour dd-trace v5, une combinaison du nom du job CI et de la commande de test.
Exemple: unit-tests, integration-tests, smoke-tests
service
Nom du service ou de la bibliothèque en cours de test.
Variable d’environnement : DD_SERVICE
Par défaut : (nom du framework de test)
Exemple : my-ui
env
Nom de l’environnement où les tests sont exécutés.
Variable d’environnement : DD_ENV
Par défaut : none
Exemples : local, ci
url
URL du Datadog Agent pour la collecte des traces sous la forme http://hostname:port.
Variable d’environnement : DD_TRACE_AGENT_URL
Par défaut : http://localhost:8126

Pour plus d’informations sur les tags réservés service et env, consultez Unified Service Tagging. Toutes les autres options de Datadog Tracer configuration peuvent également être utilisées.

Collecte des métadonnées Git

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 de test manuel

Remarque : L'API de test manuel est disponible à partir de dd-trace versions 5.23.0 et 4.47.0.

Si vous utilisez Jest, Mocha, Cypress, Playwright, Cucumber, Vitest ou WebdriverIO, n’utilisez pas l’API de test manuel. Test Optimization instrumente automatiquement ces frameworks et envoie les résultats des tests à Datadog. L’API de test manuel est incompatible avec les frameworks de test pris en charge.

Utilisez l’API de test manuel uniquement si vous utilisez un framework de test non pris en charge ou si vous disposez d’un mécanisme de test différent.

L’API de test manuel exploite le module node:diagnostics_channel de Node.js et repose sur des canaux sur lesquels vous pouvez publier :

const { channel } = require('node:diagnostics_channel')

const { describe, test, beforeEach, afterEach, assert } = require('my-custom-test-framework')

const testStartCh = channel('dd-trace:ci:manual:test:start')
const testFinishCh = channel('dd-trace:ci:manual:test:finish')
const testSuite = __filename

describe('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 début de test

Récupérez ce canal par son ID dd-trace:ci:manual:test:start pour publier qu’un test commence. Un bon endroit pour faire cela est un hook beforeEach ou similaire.

const { channel } = require('node:diagnostics_channel')
const testStartCh = channel('dd-trace:ci:manual:test:start')

// ... code for your testing framework goes here
  beforeEach(() => {
    const testDefinition = {
      testName: 'a-string-that-identifies-this-test',
      testSuite: 'what-suite-this-test-is-from.js'
    }
    testStartCh.publish(testDefinition)
  })
// code for your testing framework continues here ...

La charge utile à publier possède les attributs testName et testSuite, tous deux des chaînes, qui identifient le test sur le point de commencer.

Canal de fin de test

Récupérez ce canal par son ID dd-trace:ci:manual:test:finish pour publier qu’un test se termine. Un bon endroit pour faire cela est un hook afterEach ou similaire.

const { channel } = require('node:diagnostics_channel')
const testFinishCh = channel('dd-trace:ci:manual:test:finish')

// ... code for your testing framework goes here
  afterEach(() => {
    const testStatusPayload = {
      status: 'fail',
      error: new Error('assertion error')
    }
    testStartCh.publish(testStatusPayload)
  })
// code for your testing framework continues here ...

La charge utile à publier possède les attributs status et error :

  • status est une chaîne qui prend l’une des trois valeurs suivantes :

    • 'pass' lorsqu’un test réussit.
    • 'fail' lorsqu’un test échoue.
    • 'skip' lorsqu’un test a été ignoré.
  • error est un objet Error contenant la raison pour laquelle un test a échoué.

Canal d’ajout de tags

Récupérez ce canal par son ID dd-trace:ci:manual:test:addTags pour publier qu’un test nécessite des tags personnalisés. Cela peut être fait au sein de la fonction de test :

const { channel } = require('node:diagnostics_channel')
const testAddTagsCh = channel('dd-trace:ci:manual:test:addTags')

// ... code for your testing framework goes here
  test('can sum', () => {
    testAddTagsCh.publish({ 'test.owner': 'my-team', 'number.assertions': 3 })
    const result = sum(2, 1)
    assert.equal(result, 3)
  })
// code for your testing framework continues here ...

La charge utile à publier est un dictionnaire <string, string|number> de tags ou de mesures qui sont ajoutés au test.

Exécuter les tests

Lorsque les canaux de début et de fin de test sont dans votre code, exécutez votre framework de test comme vous le faites normalement, en incluant les variables d’environnement suivantes :

NODE_OPTIONS="-r dd-trace/ci/init" DD_TEST_SESSION_NAME=custom-tests yarn run-my-test-framework

Limitations connues

Tests de navigateur

Les tests de navigateur exécutés avec mocha, jest, cucumber, cypress, playwright et vitest sont instrumentés par dd-trace-js, mais la visibilité sur la session de navigateur elle-même n’est pas fournie par défaut (par exemple, les appels réseau, les actions utilisateur, les chargements de page, et plus encore).

Si vous souhaitez une visibilité sur le processus de navigateur, envisagez d’utiliser RUM & Session Replay. Lors de l’utilisation de Cypress ou Playwright, les résultats des tests et leurs sessions de navigateur RUM générées ainsi que les relectures de session sont automatiquement liés. Pour plus d’informations, consultez le guide d’instrumentation de vos tests de navigateur avec RUM.

Mode interactif Cypress

Le mode interactif Cypress (auquel vous pouvez accéder en exécutant cypress open) n’est pas pris en charge par Test Optimization car certains événements Cypress, tels que before:run, ne sont pas déclenchés. Si vous souhaitez essayer malgré tout, transmettez experimentalInteractiveRunEvents: true au fichier de configuration Cypress.

Les tentatives exigent l’isolation des tests Cypress

L’isolation des tests de Cypress test isolation doit être activée (par défaut) pour que les fonctionnalités Test Optimization basées sur les tentatives fonctionnent. Lorsque testIsolation est défini sur false dans votre configuration Cypress, dd-trace désactive toutes les tentatives de test —Early Flake Detection, Auto Test Retries et tentative de correction—car ces fonctionnalités réexécutent chaque test sur place, ce qui nécessite l’isolation.

Lorsque l’isolation est désactivée, le traceur enregistre l’avertissement Test isolation is disabled, retries will not be enabled, et aucune exécution de test n’est marquée avec @test.test_management.is_attempt_to_fix. Parce que le traceur lit le global testIsolation valeur, les remplacements describe par suite ne réactivent pas les tentatives.

Jest --forceExit

L’option –forceExit de Jest peut entraîner une perte de données. Datadog essaie d’envoyer des données immédiatement après la fin de vos tests, mais l’arrêt brutal du processus peut entraîner l’échec de certaines requêtes. Utilisez --forceExit avec prudence.

Mocha --exit

L’option –exit de Mocha peut entraîner une perte de données. Datadog essaie d’envoyer des données immédiatement après la fin de vos tests, mais l’arrêt brutal du processus peut entraîner l’échec de certaines requêtes. Utilisez --exit avec prudence.

La surcharge de durée de test de Vitest

Par défaut, l’option isolate de Vitest est true, donc chaque fichier de test s’exécute dans son propre fork ou thread. Vitest est axé sur l’ESM et s’appuie sur import-in-the-middle pour l’instrumentation, ce qui entraîne un coût de configuration à chaque démarrage d’une suite. Avec l’isolation, ce coût de configuration est répété pour chaque fichier. L’effet est plus marqué lorsque vous disposez de nombreuses petites suites rapides, car le temps de configuration peut dominer le temps d’exécution global.

Pour réduire la surcharge, définissez isolate: false dans votre fichier de configuration Vitest, ou passez --no-isolate à la commande de test.

Pour maintenir l’isolation de Vitest activée avec une surcharge de démarrage de worker plus faible, définissez DD_EXPERIMENTAL_TEST_OPT_VITEST_NO_WORKER_INIT=true. Cette option est disponible dans dd-trace v5 (à partir de 5.111.0) et v6 (à partir de 6.0.0). Elle s’applique aux exécutions isolées du pool de workers Vitest avec Vitest 3.2.6 et versions ultérieures, et revient à une instrumentation de worker normale pour les configurations non prises en charge.

Comme ce mode n’initialise pas dd-trace dans les workers Vitest, les fonctionnalités suivantes ne sont pas prises en charge :

  • Tags de test personnalisés
  • Spans personnalisés :
  • Corrélation de logs à partir du code de test :
  • Rejeu de test échoué

Bonnes pratiques

Suivez ces pratiques pour tirer pleinement parti du framework de test et de Test Optimization.

Tests paramétrés

Dans la mesure du possible, tirez parti des outils fournis par les frameworks de test pour les tests paramétrés. Par exemple, pour jest :

Évitez ceci :

[[1,2,3], [3,4,7]].forEach((a,b,expected) => {
  test('sums correctly', () => {
    expect(a+b).toEqual(expected)
  })
})

Et utilisez plutôt test.each :

test.each([[1,2,3], [3,4,7]])('sums correctly %i and %i', (a,b,expected) => {
  expect(a+b).toEqual(expected)
})

Pour mocha, utilisez mocha-each :

const forEach = 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)
});

Lorsque vous utilisez cette approche, le framework de test et Test Optimization peuvent distinguer vos tests.

Nom de la session de test DD_TEST_SESSION_NAME

Utilisez DD_TEST_SESSION_NAME pour définir le nom de la session de test et le groupe de tests associé. Voici des exemples de valeurs pour ce tag :

  • unit-tests
  • integration-tests
  • smoke-tests
  • flaky-tests
  • ui-tests
  • backend-tests

Si DD_TEST_SESSION_NAME n’est pas spécifié, la valeur par défaut est :

  • Pour dd-trace v6, l’appel du framework, tel que jest, mocha, playwright test ou cucumber-js
  • Pour dd-trace v5, une combinaison du nom du job CI et de la commande utilisée pour exécuter les tests (par exemple, my-ci-job yarn test)

Le nom de la session de test doit être unique au sein d’un dépôt pour vous aider à distinguer différents groupes de tests.

Pour aller plus loin