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.
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 de l’interface de ligne de commande du traceur .NET
Installez ou mettez à jour la commande dd-trace en utilisant l’une des méthodes suivantes :
En utilisant le SDK .NET en exécutant la commande :
Pour instrumenter votre collection de tests, faites précéder votre commande de test par dd-trace ci run. Vous pouvez utiliser --dd-service pour définir le service ou la bibliothèque en cours de test et --dd-env pour définir l’environnement dans lequel les tests sont exécutés. Exemple :
dd-trace ci run --dd-service=my-dotnet-app -- VSTest.Console.exe {test_assembly}.dll
Tous les tests sont automatiquement instrumentés.
Compatibilité avec le package nuget Microsoft.CodeCoverage
Depuis la version Microsoft.CodeCoverage17.2.0, Microsoft a introduit l’instrumentation dynamique utilisant .NET CLR Profiling API activée par défaut uniquement sur Windows. L’instrumentation automatique de Datadog repose sur .NET CLR Profiling API. Cette API n’autorise qu’un seul abonné (par exemple, dd-trace). L’utilisation de l’instrumentation dynamique de CodeCoverage interrompt l’instrumentation automatique des tests.
La solution consiste à passer de l’instrumentation dynamique à l’instrumentation statique. Modifiez votre fichier .runsettings avec les paramètres de configuration suivants :
<?xml version="1.0" encoding="utf-8"?><RunSettings><DataCollectionRunSettings><DataCollectors><DataCollectorfriendlyName="Code Coverage"><Configuration><CodeCoverage><!-- Switching to static instrumentation (dynamic instrumentation collides with dd-trace instrumentation) --><EnableStaticManagedInstrumentation>True</EnableStaticManagedInstrumentation><EnableDynamicManagedInstrumentation>False</EnableDynamicManagedInstrumentation><UseVerifiableInstrumentation>False</UseVerifiableInstrumentation><EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation><EnableDynamicNativeInstrumentation>False</EnableDynamicNativeInstrumentation> ...
</CodeCoverage></Configuration></DataCollector></DataCollectors></DataCollectionRunSettings></RunSettings>
Paramètres de configuration
Vous pouvez modifier la configuration par défaut de l’interface de ligne de commande en utilisant des arguments de ligne de commande ou des variables d’environnement. Pour obtenir une liste complète des paramètres de configuration, exécutez :
dd-trace ci run --help
La liste suivante indique les valeurs par défaut des paramètres de configuration clé :
--dd-service (Facultatif)
Nom du service ou de la bibliothèque à tester. Variable d’environnement: DD_SERVICE Par défaut: Le nom du dépôt Exemple: my-dotnet-app
--dd-env (Facultatif)
Nom de l’environnement où les tests sont exécutés. Variable d’environnement : DD_ENV Par défaut : none Exemples : local, ci
--agent-url (Uniquement lors de l’utilisation du Datadog Agent)
L’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
test_session.name (Disponible uniquement en tant que variable d’environnement)
Identifie un groupe de tests, tel que unit-tests, integration-tests ou smoke-tests. Variable d’environnement : DD_TEST_SESSION_NAME Par défaut: Le nom du job CI et la commande de test, ou la commande de test si le nom du job CI n’est pas disponible. Exemple: unit-tests, integration-tests, smoke-tests
Vous pouvez ajouter des tags personnalisés à vos tests en utilisant la span actuellement active :
// inside your testvarscope=Tracer.Instance.ActiveScope;// from Datadog.Trace;if(scope!=null){scope.Span.SetTag("test_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 Ajout de tags de la documentation sur l’instrumentation personnalisée .NET.
Tout comme pour les tags, vous pouvez ajouter des mesures personnalisées à vos tests en utilisant le span actif :
// inside your testvarscope=Tracer.Instance.ActiveScope;// from Datadog.Trace;if(scope!=null){scope.Span.SetTag("memory_allocations",16);}// test continues normally// ...
Pour créer des filtres ou des visualisations pour ces tags, vous devez d’abord créer des facettes. Pour plus d’informations sur l’ajout de tags, consultez la section Ajout de tags de la documentation sur l’instrumentation personnalisée .NET.
Lorsque la couverture de code est disponible, le Datadog Tracer (v2.31.0 ou ultérieure) la rapporte sous le tag test.code_coverage.lines_pct pour vos sessions de test.
Si vous utilisez Coverlet pour calculer votre couverture de code, indiquez le chemin vers le fichier de rapport dans la variable d’environnement DD_CIVISIBILITY_EXTERNAL_CODE_COVERAGE_PATH lors de l’exécution de dd-trace. Le fichier de rapport doit être au format OpenCover ou Cobertura. Alternativement, vous pouvez activer le calcul de couverture de code intégré du Datadog Tracer avec la variable d’environnement DD_CIVISIBILITY_CODE_COVERAGE_ENABLED=true.
Remarque : Lorsque vous utilisez Test Impact Analysis, la couverture de code intégrée du SDK est activée par défaut.
Vous pouvez voir l’évolution de la couverture des tests dans l’onglet Coverage d’une session de test.
Pour plus d’informations sur les options d’exclusion, consultez Code Coverage.
Instrumentation des tests BenchmarkDotNet
Pour instrumenter vos tests BenchmarkDotNet, vous devez :
Configurez votre projet pour utiliser l’exportateur Datadog.Trace.BenchmarkDotNet en utilisant l’attribut DatadogDiagnoser ou la méthode d’extension WithDatadog(). Exemple :
Exécutez le projet BenchmarkDotNet comme vous le faites habituellement, tous les tests BenchmarkDotNet seront automatiquement instrumentés.
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
Instrumentation personnalisée
Remarque : Votre configuration d'instrumentation personnalisée dépend de la dd-trace version. Pour utiliser l'instrumentation personnalisée, vous devez maintenir synchronisées les versions des packages NuGet. dd-trace et Datadog.Trace Les packages NuGet doivent être synchronisés.
Pour utiliser l’instrumentation personnalisée dans votre application .NET, procédez comme suit :
Exécutez dd-trace --version pour obtenir la version de l’outil.
Ajoutez le Datadog.Tracepackage NuGet avec la même version à votre application.
Dans le code de votre application, accédez au traceur global via la propriété Datadog.Trace.Tracer.Instance pour créer de nouveaux spans.
Remarque : Pour utiliser l'API de test manuel, vous devez ajouter le Datadog.Trace package NuGet dans le projet .NET cible.
Si vous utilisez XUnit, NUnit ou MSTest avec vos projets .NET, Test Optimization les instrumente automatiquement et envoie les résultats des tests à Datadog. Si vous utilisez un framework de test non pris en charge ou si vous disposez d’un mécanisme de test différent, vous pouvez utiliser l’API pour signaler les résultats des tests à Datadog.
L’API repose sur trois concepts, à savoir le module de test, les collections de tests et les tests.
Module de test
Un module de test représente l’assemblage .NET qui comprend les tests.
Pour démarrer un module de test, appelez TestModule.Create() et transmettez le nom du module ou le nom de l’assembly .NET où se trouvent les tests.
Lorsque tous vos tests sont terminés, appelez module.Close() ou module.CloseAsync(), ce qui force la bibliothèque à envoyer tous les résultats de test restants au backend.
Collections de tests
Une collection de tests comprend un ensemble de tests. Ils peuvent avoir des méthodes d’initialisation et de nettoyage communes et partager certaines variables. Dans .NET, ils sont généralement implémentés sous forme de classe de test ou de fixture contenant plusieurs méthodes de test. Une collection de tests peut éventuellement comporter des informations supplémentaires comme des attributs ou des informations d’erreur.
Créez des collections de tests dans le module de test en appelant module.GetOrCreateSuite() et en transmettant le nom de la collection de tests.
Appelez suite.Close() lorsque tous les tests associés dans la suite ont terminé leur exécution.
Tests
Chaque test s’exécute au sein d’une suite et doit se terminer par l’un de ces trois statuts : TestStatus.Pass, TestStatus.Fail ou TestStatus.Skip.
Un test peut éventuellement comporter des informations supplémentaires telles que :
Paramètres
Attributs
Informations d’erreur
Traits de test
Données de benchmark
Créez des tests dans une suite en appelant suite.CreateTest() et en transmettant le nom du test. Lorsqu’un test se termine, appelez test.Close() avec l’un des statuts prédéfinis.
Exemple de code
Le code suivant permet d’utiliser les fonctionnalités de base de l’API :
Appelez toujours module.Close() ou module.CloseAsync() à la fin afin que toutes les données de test soient transmises à Datadog.
Bonnes pratiques
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 le nom du job CI et la commande de test. Si le nom du job CI n’est pas disponible, la commande de test est utilisée.
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.
Quand utiliser DD_TEST_SESSION_NAME {#when-to-use-dd-test-session-name} :
Il existe un ensemble de paramètres que Datadog vérifie pour établir une correspondance entre les sessions de test. La commande de test utilisée pour exécuter les tests en fait partie. Si la commande de test contient une chaîne qui change à chaque exécution, comme un dossier temporaire, Datadog considère que les sessions ne sont pas liées entre elles. Exemple :
dotnet test --temp-dir=/var/folders/t1/rs2htfh55mz9px2j4prmpg_c0000gq/T
Datadog recommande d’utiliser DD_TEST_SESSION_NAME si vos commandes de test varient entre les exécutions.
Pour aller plus loin
Documentation, liens et articles supplémentaires utiles: