- 重要な情報
- はじめに
- 用語集
- エージェント
- インテグレーション
- OpenTelemetry
- 開発者
- API
- CoScreen
- アプリ内
- インフラストラクチャー
- アプリケーションパフォーマンス
- 継続的インテグレーション
- ログ管理
- セキュリティ
- UX モニタリング
- 管理
対応する .NET バージョン:
対応するテストフレームワーク:
テストスイートレベルの可視化は dd-trace-dotnet>=2.16.0
からサポートされるようになりました。
Datadog にテスト結果を報告するには、Datadog の .NET ライブラリを構成する必要があります。
Jenkins や自己管理型の GitLab CI などのオンプレミス CI プロバイダーでテストを実行する場合、Agent インストール手順に従って各ワーカノードに Datadog Agent をインストールします。これは、テスト結果が自動的に基礎となるホストメトリクスにリンクされるため、推奨されるオプションです。
CI プロバイダーがコンテナベースのエグゼキューターを使用している場合、ビルド内の localhost
の使用ではコンテナ自体を参照しており、Datadog Agent が動作している基礎となるワーカーノードではないため、すべてのビルドで DD_AGENT_HOST
環境変数 (デフォルトは http://localhost:8126
) を、ビルドコンテナの中からアクセスできるエンドポイントに設定します。
Kubernetes のエグゼキューターを使用している場合、Datadog は Datadog Admission Controller の使用を推奨しており、これは自動的にビルドポッドの環境変数 DD_AGENT_HOST
を設定してローカルの Datadog Agent と通信させます。
GitHub Actions や CircleCI など、基盤となるワーカーノードにアクセスできないクラウド CI プロバイダーを使用している場合は、Agentless モードを使用するようにライブラリを構成します。そのためには、以下の環境変数を設定します。
DD_CIVISIBILITY_AGENTLESS_ENABLED=true
(必須)false
DD_API_KEY
(必須)(empty)
さらに、どの Datadog サイトにデータを送信するかを構成します。
DD_SITE
(必須)datadoghq.com
以下のいずれかの方法で dd-trace
コマンドをインストールまたは更新してください。
以下のコマンドを実行して、.NET SDK を使用する。
dotnet tool update -g dd-trace
適切なバージョンをダウンロードする。
または、github のリリースページよりダウンロードする。
テストスイートをインスツルメントするには、テストコマンドの前に dd-trace ci run
を付け、テスト中のサービスまたはライブラリの名前を --dd-service
パラメーターとして指定し、テストが実行されている環境 (たとえば、 開発者ワークステーションでテストを実行する場合は local
、CI プロバイダーでテストを実行する場合は ci
) を --dd-env
パラメーターとして使用します。例:
dotnet test の使用によって
dd-trace ci run --dd-service=my-dotnet-app --dd-env=ci -- dotnet test
VSTest.Console.exe の使用によって
dd-trace ci run --dd-service=my-dotnet-app --dd-env=ci -- VSTest.Console.exe {test_assembly}.dll
すべてのテストは自動的にインスツルメントされます。
コマンドライン引数または環境変数を使用して、CLI のデフォルトコンフィギュレーションを変更できます。コンフィギュレーション設定の完全なリストについては、以下を実行してください。
dd-trace ci run --help
次のリストは、主要なコンフィギュレーション設定のデフォルト値を示しています。
--dd-service
DD_SERVICE
my-dotnet-app
--dd-env
DD_ENV
none
local
、ci
--agent-url
http://hostname:port
の形式のトレース収集用の Datadog Agent URL。DD_TRACE_AGENT_URL
http://localhost:8126
他のすべての Datadog トレーサーコンフィギュレーションオプションも使用できます。
現在アクティブなスパンを使用して、テストにカスタムタグを追加することができます。
// テスト内
var scope = Tracer.Instance.ActiveScope; // from Datadog.Trace;
if (scope != null) {
scope.Span.SetTag("test_owner", "my_team");
}
// テストは正常に続きます
// ...
これらのタグに対して、フィルターや group by
フィールドを作成するには、まずファセットを作成する必要があります。タグの追加についての詳細は、.NET カスタムインスツルメンテーションドキュメントのタグの追加セクションを参照してください。
コードカバレッジが利用できる場合、Datadog トレーサー (v2.31.0+) は、テストセッションの test.code_coverage.lines_pct
タグでそれを報告します。
コードカバレッジの計算に Coverlet を使用している場合、dd-trace
を実行する際に DD_CIVISIBILITY_EXTERNAL_CODE_COVERAGE_PATH
環境変数にレポートファイルへのパスを指定します。レポートファイルは、OpenCover または Cobertura 形式である必要があります。また、環境変数 DD_CIVISIBILITY_CODE_COVERAGE_ENABLED=true
で、Datadog トレーサーに内蔵されているコードカバレッジ計算を有効にできます。
注: Intelligent Test Runner を使用する場合、トレーサーに内蔵されたコードカバレッジはデフォルトで有効になっています。
テストセッションの Coverage タブで、テストカバレッジの推移を見ることができます。
ベンチマークテストをインスツルメンテーションするために必要なこと
Datadog.Trace.BenchmarkDotNet
NuGet パッケージをプロジェクトに追加します (例えば、dotnet add package Datadog.Trace.BenchmarkDotNet
を使用します)。DatadogDiagnoser
属性または WithDatadog()
拡張機能を使って、 Datadog.Trace.BenchmarkDotNet
エクスポーターを使用するようにプロジェクトを構成してください。例:using BenchmarkDotNet.Attributes;
using Datadog.Trace.BenchmarkDotNet;
[DatadogDiagnoser]
[MemoryDiagnoser]
public class OperationBenchmark
{
[Benchmark]
public void Operation()
{
// ...
}
}
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Running;
using Datadog.Trace.BenchmarkDotNet;
var config = DefaultConfig.Instance
.WithDatadog();
BenchmarkRunner.Run<OperationBenchmark>(config);
Datadog は、テスト結果を可視化し、リポジトリ、ブランチ、コミットごとにグループ化するために Git の情報を使用します。Git のメタデータは、CI プロバイダーの環境変数や、プロジェクトパス内のローカルな .git
フォルダがあれば、そこからテストインスツルメンテーションによって自動的に収集されます。
サポートされていない CI プロバイダーでテストを実行する場合や、.git
フォルダがない場合は、環境変数を使って Git の情報を手動で設定することができます。これらの環境変数は、自動検出された情報よりも優先されます。Git の情報を提供するために、以下の環境変数を設定します。
DD_GIT_REPOSITORY_URL
git@github.com:MyCompany/MyApp.git
、https://github.com/MyCompany/MyApp.git
DD_GIT_BRANCH
develop
DD_GIT_TAG
1.0.1
DD_GIT_COMMIT_SHA
a18ebf361cc831f5535e58ec4fae04ffd98d8152
DD_GIT_COMMIT_MESSAGE
Set release number
DD_GIT_COMMIT_AUTHOR_NAME
John Smith
DD_GIT_COMMIT_AUTHOR_EMAIL
john@example.com
DD_GIT_COMMIT_AUTHOR_DATE
2021-03-12T16:00:28Z
DD_GIT_COMMIT_COMMITTER_NAME
Jane Smith
DD_GIT_COMMIT_COMMITTER_EMAIL
jane@example.com
DD_GIT_COMMIT_COMMITTER_DATE
2021-03-12T16:00:28Z
dd-trace
のバージョンに依存します。カスタムインスツルメンテーションを使用するには、dd-trace
と Datadog.Trace
の NuGet パッケージのバージョンを同期させておく必要があります。.NET アプリケーションでカスタムインスツルメンテーションを使用するには
dd-trace --version
を実行します。Datadog.Trace
NuGet パッケージをアプリケーションに追加します。Datadog.Trace.Tracer.Instance
プロパティを介してグローバルトレーサーにアクセスし、新しいスパンを作成します。カスタムインスツルメンテーションのスパンやタグの追加方法については、.NET カスタムインスツルメンテーションのドキュメントを参照してください。
Datadog.Trace
NuGet パッケージを追加する必要があります。.NET プロジェクトで XUnit、NUnit、MSTest を使用している場合、CI Visibility は自動的にインスツルメンテーションを行い、Datadog にテスト結果を送信します。サポートされていないテストフレームワークを使用している場合、または別のテストメカニズムを持っている場合、代わりに API を使用して Datadog にテスト結果を報告することができます。
この API は、テストモジュール、テストスイート、テストの 3 つの概念に基づいています。
テストモジュールは、テストを含む .NET アセンブリを表します。
テストモジュールを起動するには、TestModule.Create()
を呼び出し、テストが配置されているモジュールの名前または .NET アセンブリ名を渡します。
すべてのテストが終了したら、module.Close()
または module.CloseAsync()
を呼び出して、残りのテスト結果をすべてバックエンドに送信するようにします。
テストスイートは、テストのセットで構成されます。これらのテストは、共通の初期化および終了メソッドを持ち、いくつかの変数を共有することができます。.NET では、通常、複数のテストメソッドを含むテストクラスまたはフィクスチャとして実装されます。テストスイートは、属性やエラー情報などの追加情報を持つこともできます。
テストスイートは module.GetOrCreateSuite()
を呼び出してテストスイートの名前を渡すことでテストモジュールに作成します。
スイートの中の関連するテストがすべて実行を終えたら suite.Close()
を呼び出します。
各テストはスイートの中で実行され、TestStatus.Pass
、TestStatus.Fail
、TestStatus.Skip
の 3 つのステータスのいずれかで終了する必要があります。
テストは、オプションで以下のような付加情報を持つことができます。
suite.CreateTest()
を呼び出し、テストの名前を渡すことで、スイート内のテストを作成します。テストが終了したら、あらかじめ定義されたステータスのいずれかを指定して test.Close()
を呼び出します。
namespace Datadog.Trace.Ci
{
/// <summary>
/// CI Visibility テストモジュール
/// </summary>
public sealed class TestModule
{
/// <summary>
/// テストフレームワークを取得します
/// </summary>
public string? Framework { get; }
/// <summary>
/// モジュール名を取得します
/// </summary>
public string Name { get; }
/// <summary>
/// テストモジュールの開始日を取得します
/// </summary>
public System.DateTimeOffset StartTime { get; }
/// <summary>
/// テストモジュールを閉じます
/// </summary>
/// <remarks>可能な限り CloseAsync() バージョンを使用します。</remarks>
public void Close() { }
/// <summary>
/// テストモジュールを閉じます
/// </summary>
/// <remarks>可能な限り CloseAsync() バージョンを使用します。</remarks>
/// <param name="duration">テストモジュールの期間</param>
public void Close(System.TimeSpan? duration) { }
/// <summary>
/// テストモジュールを閉じます
/// </summary>
/// <returns>タスクインスタンス </returns>
public System.Threading.Tasks.Task CloseAsync() { }
/// <summary>
/// テストモジュールを閉じます
/// </summary>
/// <param name="duration">テストモジュールの期間</param>
/// <returns>タスクインスタンス </returns>
public System.Threading.Tasks.Task CloseAsync(System.TimeSpan? duration) { }
/// <summary>
/// このセッションのために新しいテストスイートを作成します
/// </summary>
/// <param name="name">テストスイートの名前</param>
/// <returns>テストスイートインスタンス</returns>
public Datadog.Trace.Ci.TestSuite GetOrCreateSuite(string name) { }
/// <summary>
/// このセッションのために新しいテストスイートを作成します
/// </summary>
/// <param name="name">テストスイートの名前</param>
/// <param name="startDate">テストスイートの開始日</param>
/// <returns>テストスイートインスタンス</returns>
public Datadog.Trace.Ci.TestSuite GetOrCreateSuite(string name, System.DateTimeOffset? startDate) { }
/// <summary>
/// 例外からエラー情報を設定します
/// </summary>
/// <param name="exception">例外インスタンス</param>
public void SetErrorInfo(System.Exception exception) { }
/// <summary>
/// エラー情報を設定します
/// </summary>
/// <param name="type">エラータイプ</param>
/// <param name="message">エラーメッセージ</param>
/// <param name="callStack">エラーのコールスタック</param>
public void SetErrorInfo(string type, string message, string? callStack) { }
/// <summary>
/// 数字タグをテストに設定します
/// </summary>
/// <param name="key">タグのキー</param>
/// <param name="value">タグの値</param>
public void SetTag(string key, double? value) { }
/// <summary>
/// 文字列タグをテストに設定します
/// </summary>
/// <param name="key">タグのキー</param>
/// <param name="value">タグの値</param>
public void SetTag(string key, string? value) { }
/// <summary>
/// 新しいテストモジュールを作成します
/// </summary>
/// <param name="name">テストモジュール名</param>
/// <returns>新しいテストモジュールインスタンス</returns>
public static Datadog.Trace.Ci.TestModule Create(string name) { }
/// <summary>
/// 新しいテストモジュールを作成します
/// </summary>
/// <param name="name">テストモジュール名</param>
/// <param name="framework">テスティングフレームワーク名</param>
/// <param name="frameworkVersion">テスティングフレームワークのバージョン</param>
/// <returns>新しいテストモジュールインスタンス</returns>
public static Datadog.Trace.Ci.TestModule Create(string name, string framework, string frameworkVersion) { }
/// <summary>
/// 新しいテストモジュールを作成します
/// </summary>
/// <param name="name">テストモジュール名</param>
/// <param name="framework">テスティングフレームワーク名</param>
/// <param name="frameworkVersion">テスティングフレームワークのバージョン</param>
/// <param name="startDate">テストセッション開始日</param>
/// <returns>新しいテストモジュールインスタンス</returns>
public static Datadog.Trace.Ci.TestModule Create(string name, string framework, string frameworkVersion, System.DateTimeOffset startDate) { }
}
/// <summary>
/// CI Visibility テストスイート
/// </summary>
public sealed class TestSuite
{
/// <summary>
/// このスイートのテストモジュールを取得します
/// </summary>
public Datadog.Trace.Ci.TestModule Module { get; }
/// <summary>
/// テストスイート名を取得します
/// </summary>
public string Name { get; }
/// <summary>
/// テストスイートの開始日を取得します
/// </summary>
public System.DateTimeOffset StartTime { get; }
/// <summary>
/// テストスイートを閉じます
/// </summary>
public void Close() { }
/// <summary>
/// テストスイートを閉じます
/// </summary>
/// <param name="duration">テストスイートの期間</param>
public void Close(System.TimeSpan? duration) { }
/// <summary>
/// このスイートの新しいテストを作成します
/// </summary>
/// <param name="name">テスト名</param>
/// <returns>テストインスタンス</returns>
public Datadog.Trace.Ci.Test CreateTest(string name) { }
/// <summary>
/// このスイートの新しいテストを作成します
/// </summary>
/// <param name="name">テストの名前</param>
/// <param name="startDate">テスト開始日</param>
/// <returns>テストインスタンス</returns>
public Datadog.Trace.Ci.Test CreateTest(string name, System.DateTimeOffset startDate) { }
/// <summary>
/// 例外からエラー情報を設定します
/// </summary>
/// <param name="exception">例外インスタンス</param>
public void SetErrorInfo(System.Exception exception) { }
/// <summary>
/// エラー情報を設定します
/// </summary>
/// <param name="type">エラータイプ</param>
/// <param name="message">エラーメッセージ</param>
/// <param name="callStack">エラーのコールスタック</param>
public void SetErrorInfo(string type, string message, string? callStack) { }
/// <summary>
/// 数字タグをテストに設定します
/// </summary>
/// <param name="key">タグのキー</param>
/// <param name="value">タグの値</param>
public void SetTag(string key, double? value) { }
/// <summary>
/// 文字列タグをテストに設定します
/// </summary>
/// <param name="key">タグのキー</param>
/// <param name="value">タグの値</param>
public void SetTag(string key, string? value) { }
}
/// <summary>
/// CI Visibility テスト
/// </summary>
public sealed class Test
{
/// <summary>
/// テスト名を取得します
/// </summary>
public string? Name { get; }
/// <summary>
/// テスト開始日を取得します
/// </summary>
public System.DateTimeOffset StartTime { get; }
/// <summary>
/// このテストのテストスイートを取得します
/// </summary>
public Datadog.Trace.Ci.TestSuite Suite { get; }
/// <summary>
/// ベンチマークデータを追加します
/// </summary>
/// <param name="measureType">メジャータイプ</param>
/// <param name="info">メジャー情報</param>
/// <param name="statistics">統計値</param>
public void AddBenchmarkData(Datadog.Trace.Ci.BenchmarkMeasureType measureType, string info, in Datadog.Trace.Ci.BenchmarkDiscreteStats statistics) { }
/// <summary>
/// テストを閉じます
/// </summary>
/// <param name="status">テストステータス</param>
public void Close(Datadog.Trace.Ci.TestStatus status) { }
/// <summary>
/// テストを閉じます
/// </summary>
/// <param name="status">テストステータス</param>
/// <param name="duration">テストスイートの期間</param>
public void Close(Datadog.Trace.Ci.TestStatus status, System.TimeSpan? duration) { }
/// <summary>
/// テストを閉じます
/// </summary>
/// <param name="status">テストステータス</param>
/// <param name="duration">テストスイートの期間</param>
/// <param name="skipReason">この場合 </param>
public void Close(Datadog.Trace.Ci.TestStatus status, System.TimeSpan? duration, string? skipReason) { }
/// <summary>
/// ベンチマークのメタデータを設定します
/// </summary>
/// <param name="hostInfo">ホスト情報</param>
/// <param name="jobInfo">ジョブ情報</param>
public void SetBenchmarkMetadata(in Datadog.Trace.Ci.BenchmarkHostInfo hostInfo, in Datadog.Trace.Ci.BenchmarkJobInfo jobInfo) { }
/// <summary>
/// 例外からエラー情報を設定します
/// </summary>
/// <param name="exception">例外インスタンス</param>
public void SetErrorInfo(System.Exception exception) { }
/// <summary>
/// エラー情報を設定します
/// </summary>
/// <param name="type">エラータイプ</param>
/// <param name="message">エラーメッセージ</param>
/// <param name="callStack">エラーのコールスタック</param>
public void SetErrorInfo(string type, string message, string? callStack) { }
/// <summary>
/// テストパラメーターを設定します
/// </summary>
/// <param name="parameters">TestParameters インスタンス</param>
public void SetParameters(Datadog.Trace.Ci.TestParameters parameters) { }
/// <summary>
/// 数字タグをテストに設定します
/// </summary>
/// <param name="key">タグのキー</param>
/// <param name="value">タグの値</param>
public void SetTag(string key, double? value) { }
/// <summary>
/// 文字列タグをテストに設定します
/// </summary>
/// <param name="key">タグのキー</param>
/// <param name="value">タグの値</param>
public void SetTag(string key, string? value) { }
/// <summary>
/// テスト方法情報を設定します
/// </summary>
/// <param name="methodInfo">Test MethodInfo インスタンス</param>
public void SetTestMethodInfo(System.Reflection.MethodInfo methodInfo) { }
/// <summary>
/// テストの特徴を設定します
/// </summary>
/// <param name="traits">特徴ディクショナリー</param>
public void SetTraits(System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<string>> traits) { }
}
/// <summary>
/// テストステータス
/// </summary>
public enum TestStatus
{
/// <summary>
/// パステストステータス
/// </summary>
Pass = 0,
/// <summary>
/// フェイルテストステータス
/// </summary>
Fail = 1,
/// <summary>
/// スキップテストステータス
/// </summary>
Skip = 2,
}
/// <summary>
/// テストパラメーター
/// </summary>
public class TestParameters
{
/// <summary>
/// テストの引数を取得または設定します
/// </summary>
public System.Collections.Generic.Dictionary<string, object>? Arguments { get; set; }
/// <summary>
/// テストパラメーターメタデータを取得または設定します
/// </summary>
public System.Collections.Generic.Dictionary<string, object>? Metadata { get; set; }
}
/// <summary>
/// ベンチマーク測定離散統計
/// </summary>
public readonly struct BenchmarkDiscreteStats
{
/// <summary>
/// 尖度値
/// </summary>
public readonly double Kurtosis;
/// <summary>
/// 最大値
/// </summary>
public readonly double Max;
/// <summary>
/// 平均値
/// </summary>
public readonly double Mean;
/// <summary>
/// 中央値
/// </summary>
public readonly double Median;
/// <summary>
/// 最小値
/// </summary>
public readonly double Min;
/// <summary>
/// サンプル数
/// </summary>
public readonly int N;
/// <summary>
/// 90 パーセンタイル値
/// </summary>
public readonly double P90;
/// <summary>
/// 95 パーセンタイル値
/// </summary>
public readonly double P95;
/// <summary>
/// 99 パーセンタイル値
/// </summary>
public readonly double P99;
/// <summary>
/// 歪度値
/// </summary>
public readonly double Skewness;
/// <summary>
/// 標準偏差値
/// </summary>
public readonly double StandardDeviation;
/// <summary>
/// 標準エラー値
/// </summary>
public readonly double StandardError;
/// <summary>
/// <see cref="BenchmarkDiscreteStats"/> 構造体の新しいインスタンスを初期化します。
/// </summary>
/// <param name="n">サンプル数</param>
/// <param name="max">最大値</param>
/// <param name="min">最小値</param>
/// <param name="mean">平均値</param>
/// <param name="median">中央値</param>
/// <param name="standardDeviation">標準偏差値</param>
/// <param name="standardError">標準エラー値</param>
/// <param name="kurtosis">尖度値</param>
/// <param name="skewness">歪度値</param>
/// <param name="p99">99 パーセンタイル値</param>
/// <param name="p95">95 パーセンタイル値</param>
/// <param name="p90">90 パーセンタイル値</param>
public BenchmarkDiscreteStats(int n, double max, double min, double mean, double median, double standardDeviation, double standardError, double kurtosis, double skewness, double p99, double p95, double p90) { }
/// <summary>
/// double の配列からベンチマークの離散統計値を取得します
/// </summary>
/// <param name="values">double の配列</param>
/// <returns>ベンチマーク離散統計インスタンス</returns>
public static Datadog.Trace.Ci.BenchmarkDiscreteStats GetFrom(double[] values) { }
}
/// <summary>
/// ベンチマークホスト情報
/// </summary>
public struct BenchmarkHostInfo
{
/// <summary>
/// クロノメーター周波数
/// </summary>
public double? ChronometerFrequencyHertz;
/// <summary>
/// クロノメーター分解能
/// </summary>
public double? ChronometerResolution;
/// <summary>
/// ロジカルコア数
/// </summary>
public int? LogicalCoreCount;
/// <summary>
/// OS バージョン
/// </summary>
public string? OsVersion;
/// <summary>
/// 物理コア数
/// </summary>
public int? PhysicalCoreCount;
/// <summary>
/// 物理プロセッサー数
/// </summary>
public int? ProcessorCount;
/// <summary>
/// プロセッサー最大周波数ヘルツ
/// </summary>
public double? ProcessorMaxFrequencyHertz;
/// <summary>
/// プロセッサー名
/// </summary>
public string? ProcessorName;
/// <summary>
/// ランタイムバージョン
/// </summary>
public string? RuntimeVersion;
}
/// <summary>
/// ベンチマークジョブ情報
/// </summary>
public struct BenchmarkJobInfo
{
/// <summary>
/// ジョブの説明
/// </summary>
public string? Description;
/// <summary>
/// ジョブプラットフォーム
/// </summary>
public string? Platform;
/// <summary>
/// ジョブランタイムの呼称
/// </summary>
public string? RuntimeMoniker;
/// <summary>
/// ジョブランタイム名
/// </summary>
public string? RuntimeName;
}
/// <summary>
/// ベンチマークメジャータイプ
/// </summary>
public enum BenchmarkMeasureType
{
/// <summary>
/// ナノ秒単位の期間
/// </summary>
Duration = 0,
/// <summary>
/// ナノ秒単位の実行時間
/// </summary>
RunTime = 1,
/// <summary>
/// バイト単位の平均ヒープ割り当て量
/// </summary>
MeanHeapAllocations = 2,
/// <summary>
/// バイト単位の合計ヒープ割り当て量
/// </summary>
TotalHeapAllocations = 3,
/// <summary>
/// ナノ秒単位のアプリケーション起動
/// </summary>
ApplicationLaunch = 4,
/// <summary>
/// ガベージコレクター gen0 カウント
/// </summary>
GarbageCollectorGen0 = 5,
/// <summary>
/// ガベージコレクター gen1 カウント
/// </summary>
GarbageCollectorGen1 = 6,
/// <summary>
/// ガベージコレクター gen2 カウント
/// </summary>
GarbageCollectorGen2 = 7,
/// <summary>
/// メモリ総動作数
/// </summary>
MemoryTotalOperations = 8,
}
}
次のコードは、API の簡単な使い方を表しています。
using System.Reflection;
using Datadog.Trace.Ci;
var module = TestModule.Create(Assembly.GetExecutingAssembly().GetName().Name ?? "(dyn_module)");
module.SetTag("ModuleTag", "Value");
var suite = module.GetOrCreateSuite("MySuite");
suite.SetTag("SuiteTag", 42);
var test = suite.CreateTest("Test01");
test.SetTag("TestTag", "Value");
test.SetParameters(new TestParameters
{
Arguments = new Dictionary<string, object>
{
["a"] = 42,
["b"] = 0,
}
});
test.SetTraits(new Dictionary<string, List<string>>
{
["Category"] = new () { "UnitTest" }
});
try
{
var a = 42;
var b = 0;
var c = a / b;
}
catch (Exception ex)
{
test.SetErrorInfo(ex);
}
test.Close(TestStatus.Fail);
suite.Close();
await module.CloseAsync();
最後に必ず module.Close()
または module.CloseAsync()
を呼び出し、すべてのテストデータを Datadog に流すようにします。
CI Visibility を有効にすると、プロジェクトから以下のデータが収集されます。
さらに、Intelligent Test Runner を有効にすると、プロジェクトから以下のデータが収集されます。