選択したサイト () では現在 CI Visibility は利用できません。

互換性

対応言語

言語バージョン
.NET Framework>= 4.6.1
.NET Core>= 2.1
.NET Core>= 3.1
.NET>= 6
.NET>= 7

対応するテストフレームワーク

テストフレームワークバージョン
xUnit>= 2.2
NUnit>= 3.0
MsTestV2>= 14
BenchmarkDotNet>= 0.13.2

報告方法の構成

Datadog にテスト結果を報告するには、Datadog .NET ライブラリを構成する必要があります。

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.

Agentless モードは Datadog .NET ライブラリのバージョン >= 2.5.1 で利用できます。

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

.NET トレーサー CLI のインストール

以下のいずれかの方法で dd-trace コマンドをインストールまたは更新してください。

テストのインスツルメンテーション

: BenchmarkDotNet の場合は、こちらの手順に従ってください。

テストスイートをインスツルメントするには、テストコマンドの前に 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
: localci
--agent-url
トレース収集のための Datadog Agent URL で、http://hostname:port の形式で指定します。
環境変数: 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 カスタムインスツルメンテーションドキュメントのタグの追加セクションを参照してください。

テストにカスタムメトリクスを追加する

テストにカスタムメトリクスを追加するには、まずカスタムインスツルメンテーションを構成します。

タグと同様に、現在アクティブなスパンを使用して、テストにカスタムメトリクスを追加できます。

// テスト内
var scope = Tracer.Instance.ActiveScope; // from Datadog.Trace;
if (scope != null) {
    scope.Span.SetTag("memory_allocations", 16);
}
// テストは正常に続きます
// ...

これらのタグに対して、フィルターや視覚化を作成するには、まずファセットを作成する必要があります。タグの追加についての詳細は、.NET カスタムインスツルメンテーションドキュメントのタグの追加セクションを参照してください。

カスタムメトリクスについては、カスタムメトリクスの追加ガイドを参照してください。

コードカバレッジを報告する

コードカバレッジが利用できる場合、Datadog トレーサー (v2.31.0 以降) は、テストセッションの test.code_coverage.lines_pct タグでそれを報告します。

コードカバレッジの計算に [Coverlet][101] を使用している場合、dd-trace を実行する際に DD_CIVISIBILITY_EXTERNAL_CODE_COVERAGE_PATH 環境変数にレポートファイルへのパスを指定します。レポートファイルは、OpenCover または Cobertura 形式である必要があります。または、DD_CIVISIBILITY_CODE_COVERAGE_ENABLED=true 環境変数で、Datadog トレーサーに内蔵されているコードカバレッジ計算を有効にできます。

: Intelligent Test Runner を使用する場合、トレーサーに内蔵されたコードカバレッジはデフォルトで有効になっています。

テストセッションの Coverage タブで、テストカバレッジの推移を見ることができます。

除外オプションの詳細については、コードカバレッジを参照してください。

BenchmarkDotNet テストのインスツルメンテーション

ベンチマークテストをインスツルメンテーションするには

  1. Datadog.Trace.BenchmarkDotNet NuGet パッケージをプロジェクトに追加します (例えば、dotnet add package Datadog.Trace.BenchmarkDotNet を使用します)。
  2. 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);
  1. 報告方法を構成します
  2. 通常通りベンチマークプロジェクトを実行すると、すべてのベンチマークテストが自動的にインスツルメンテーションされます。

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

カスタムインスツルメンテーション

注: カスタムインスツルメンテーションの設定は、dd-trace のバージョンに依存します。カスタムインスツルメンテーションを使用するには、dd-traceDatadog.Trace の NuGet パッケージのバージョンを同期させておく必要があります。

.NET アプリケーションでカスタムインスツルメンテーションを使用するには

  1. ツールのバージョンを取得するには、dd-trace --version を実行します。
  2. 同じバージョンの Datadog.Trace NuGet パッケージをアプリケーションに追加します。
  3. アプリケーションコードで、Datadog.Trace.Tracer.Instance プロパティを介してグローバルトレーサーにアクセスし、新しいスパンを作成します。

カスタムインスツルメンテーションのスパンやタグの追加方法については、.NET カスタムインスツルメンテーションのドキュメントを参照してください。

手動テスト API

注: 手動テスト API を使用するには、対象の .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.PassTestStatus.FailTestStatus.Skip のいずれかのステータスで終了する必要があります。

テストは、オプションで以下のような付加情報を持つことができます。

  • パラメーター
  • 属性
  • エラー情報
  • テスト特性
  • ベンチマークデータ

suite.CreateTest() を呼び出し、テストの名前を渡すことで、スイート内のテストを作成します。テストが終了したら、あらかじめ定義されたステータスのいずれかを指定して test.Close() を呼び出します。

API インターフェイス

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 に送信されるようにします。

その他の参考資料