現在、選択されたサイト () では、CI Visibility はご利用いただけません。

互換性

サポートされている言語:

言語バージョン
Ruby>= 2.7
JRuby>= 9.4

サポートされているテストフレームワーク:

テストフレームワークバージョン
RSpec>= 3.0.0
Minitest>= 5.0.0
Cucumber>= 3.0

サポートされているテストランナー:

テストランナーバージョン
Knapsack Pro>= 7.2.0
ci-queue>= 0.53.0

レポート方法の構成

Datadog にテスト結果を報告するには、datadog-ci gem を構成する必要があります。

GitHub Actions や CircleCI など、基盤となるワーカーノードにアクセスできないクラウド CI プロバイダーを使用している場合は、Agentless モードを使用するようにライブラリを構成します。そのためには、以下の環境変数を設定します。

DD_CIVISIBILITY_AGENTLESS_ENABLED=true (必須)
Agentless モードを有効または無効にします。
デフォルト: false
DD_API_KEY (必須)
テスト結果のアップロードに使用される Datadog API キー
デフォルト: (empty)

さらに、データを送信する Datadog サイトを構成します。

DD_SITE (必須)
結果をアップロードする Datadog サイト
デフォルト: datadoghq.com

Jenkins や自己管理型の GitLab CI など、オンプレミスの CI プロバイダーでテストを実行している場合は、Agent のインストール手順に従って、各ワーカーノードに Datadog Agent をインストールします。 これは、テスト結果をログおよび基盤となるホストのメトリクスに自動的にリンクできるため、推奨されるオプションです。

Kubernetes エグゼキュータを使用している場合は、Datadog が Datadog Operator の使用を推奨しています。 この Operator には Datadog Admission Controller が含まれており、自動的にビルドポッドにトレーサーライブラリを注入 することができます。 注: Datadog Operator を使用する場合、Admission Controller がトレーサーライブラリのダウンロードと注入を行うため、以下のステップを省略することができます。 ただし、Test Visibility を有効にするために必要な環境変数またはコマンドラインパラメーターをポッドで設定する必要があります。

Kubernetes を使用していない、または Datadog Admission Controller を使用できない場合で、CI プロバイダーがコンテナベースのエクゼキュータを使用している場合、トレーサーを実行するビルドコンテナの DD_TRACE_AGENT_URL 環境変数 (デフォルトは http://localhost:8126) を、そのコンテナ内からアクセス可能なエンドポイントに設定します。注: ビルドコンテナ内で localhost を使用すると、コンテナ自体を参照し、基盤となるワーカーノードや Container Agent が動作しているコンテナを参照しません。

DD_TRACE_AGENT_URL は、プロトコルとポート (例えば、http://localhost:8126) を含み、DD_AGENT_HOSTDD_TRACE_AGENT_PORT よりも優先され、CI Visibility のために Datadog Agent の URL を構成するために推奨される構成パラメーターです。

それでも Datadog Agent への接続に問題がある場合は、Agentless Mode を使用してください。 : この方法を使用する場合、テストはログインフラストラクチャーメトリクスと相関しません。

Ruby Test Visibility ライブラリのインストール

Ruby Test Visibility ライブラリをインストールするには

  1. Gemfiledatadog-ci gem を追加します。

Gemfile

source "<https://rubygems.org>"
gem "datadog-ci", "~> 1.0", group: :test
  1. bundle install を実行して gem をインストールします。

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

RSpec インテグレーションは、rspec テストフレームワークを使用している際に、すべてのグループや例の実行をトレースします。

インテグレーションを有効にするには、spec_helper.rb ファイルに次の内容を追加します。

require "rspec"
require "datadog/ci"

# CI 上でテストインスツルメンテーションのみを有効にします
if ENV["DD_ENV"] == "ci"
Datadog.configure do |c|
# Test Visibility を有効にします
c.ci.enabled = true

# テスト対象のサービスまたはライブラリの名前
c.service = "my-ruby-app"

# RSpec のインスツルメンテーションを有効にします
c.ci.instrument :rspec
end
end

通常通りテストを実行し、DD_ENV 環境変数でテスト環境を指定します。

次の環境を使用できます。

  • 開発者のワークステーションでテストを実行する場合は local
  • CI プロバイダー上で実行する場合は ci

例えば:

DD_ENV=ci bundle exec rake spec

Minitest インテグレーションは、minitest フレームワークで実行されるすべてのテストをトレースします。

インテグレーションを有効にするには、test_helper.rb ファイルに次の内容を追加します。

require "minitest"
require "datadog/ci"

# CI 上でテストインスツルメンテーションのみを有効にします。
if ENV["DD_ENV"] == "ci"
Datadog.configure do |c|
# Test Visibility を有効にします
c.ci.enabled = true

# テスト対象のサービスまたはライブラリの名前
c.service = "my-ruby-app"

c.ci.instrument :minitest
end
end

通常通りテストを実行し、DD_ENV 環境変数でテスト環境を指定します。

次の環境を使用できます。

  • 開発者のワークステーション上でテストを実行する場合は local
  • CI プロバイダー上で実行する場合は ci

例えば:

DD_ENV=ci bundle exec rake test
注: `minitest/autorun` を使用する場合、`datadog/ci` が `minitest/autorun` より先に実行されるようにしてください。

minitest/autorun を使用した構成例:

require "datadog/ci"
require "minitest/autorun"

if ENV["DD_ENV"] == "ci"
  Datadog.configure do |c|
    c.ci.enabled = true

    c.service = "my-ruby-app"

    c.ci.instrument :minitest
  end
end

Cucumber インテグレーションでは、cucumber フレームワークを使用している場合のシナリオとステップの実行をトレースすることができます。

インテグレーションをアクティブ化するには、次のコードをアプリケーションに追加します。

require "cucumber"
require "datadog/ci"

# CI 上でテストインスツルメンテーションのみを有効にします
if ENV["DD_ENV"] == "ci"
  Datadog.configure do |c|
    # Test Visibility を有効にします
    c.ci.enabled = true

    # テスト対象のサービスまたはライブラリの名前
    c.service = "my-ruby-app"

    # Cucumber のインスツルメンテーションを有効にします
    c.ci.instrument :cucumber
  end
end

環境変数 DD_ENV でテストが実行されている環境を指定し、通常どおりテストを実行します。 以下の環境が使えます。

  • 開発者のワークステーションでテストを実行している場合は local
  • CI プロバイダー上で実行している場合は ci

例:

DD_ENV=ci bundle exec rake cucumber

テストにカスタムタグを追加する

現在アクティブなテストを使用して、テストにカスタムタグを追加することができます。

require "datadog/ci"

# テスト内
Datadog::CI.active_test&.set_tag("test_owner", "my_team")
# テストは正常に続きます
# ...

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

テストへのカスタム測定値の追加

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

require "datadog/ci"

# テスト内
Datadog::CI.active_test&.set_metric("memory_allocations", 16)
# テストは正常に続きます
# ...

カスタムメジャーの詳細については、カスタムメジャーの追加ガイドを参照してください。

構成設定

以下は、Datadog.configure ブロックを使用するか、環境変数を使用するコードで、Test Visibility ライブラリで使用できる最も重要なコンフィギュレーション設定のリストです。

service
テスト中のサービスまたはライブラリの名前。
環境変数: DD_SERVICE
デフォルト: $PROGRAM_NAME
: my-ruby-app
env
テストが実行されている環境の名前。
環境変数: DD_ENV
デフォルト: none
: localci

serviceenv の予約タグの詳細については、統合サービスタグ付けを参照してください。

次の環境変数を使用して、Datadog Agent の場所を構成できます。

DD_TRACE_AGENT_URL
http://hostname:port の形式のトレース収集用の Datadog Agent URL。
デフォルト: http://localhost:8126

他のすべての Datadog トレーサーコンフィギュレーションオプションも使用できます。

追加のインスツルメンテーションの使用

データベース操作やその他の外部呼び出しに費やされた時間を含む、テストに関する詳細なトレース情報を取得すると便利です。次のフレームグラフを参照してください。

Redis でインスツルメンテーションされたテストトレース

これを実現するには、configure ブロックで追加のインスツルメンテーションを構成します。

if ENV["DD_ENV"] == "ci"
  Datadog.configure do |c|
    #  ... ci 構成とインスツルメンテーションをここに ...
    c.tracing.instrument :redis
    c.tracing.instrument :pg
    # ... Datadog gem がサポートするその他のインスツルメンテーション ...
  end
end

または、test_helper/spec_helper で自動インスツルメンテーションを有効にすることもできます。

require "datadog/auto_instrument" if ENV["DD_ENV"] == "ci"

: CI モードでは、これらのトレースは CI Visibility に送信され、Datadog APM には表示されません

利用可能なインスツルメンテーション方法の全リストについては、トレースドキュメントを参照してください。

Webmock/VCR

WebmockVCR は、テスト実行時に HTTP リクエストをスタブ化する人気の高い Ruby ライブラリです。デフォルトでは、HTTP コールでトレースが Datadog に送信されるため、datadog-ci と併用時には失敗します。

Datadog バックエンドへの HTTP 接続を許可するには、Webmock と VCR を適切に構成する必要があります。

# Webmock
# エージェントレスモードを使用している場合:
WebMock.disable_net_connect!(:allow => /datadoghq/)

# ローカルで実行している Agent を使用している場合:
WebMock.disable_net_connect!(:allow_localhost => true)

# または、より詳細な設定を行うには、Agent URL を設定します。例:
WebMock.disable_net_connect!(:allow => "localhost:8126")

# VCR
VCR.configure do |config|
  # ... your usual configuration here ...

  # Agent を使用している場合
  config.ignore_hosts "127.0.0.1", "localhost"

  # エージェントレスモードを使用している場合
  config.ignore_request do |request|
    # datadoghq ホストへのすべてのリクエストを無視します
    request.uri =~ /datadoghq/
  end
end

Git のメタデータを収集する

Datadog は、テスト結果を可視化し、リポジトリ、ブランチ、コミットごとにグループ化するために Git の情報を使用します。Git のメタデータは、CI プロバイダーの環境変数や、プロジェクトパス内のローカルな .git フォルダがあれば、そこからテストインスツルメンテーションによって自動的に収集されます。

サポートされていない CI プロバイダーでテストを実行する場合や、.git フォルダがない場合は、環境変数を使って Git の情報を手動で設定することができます。これらの環境変数は、自動検出された情報よりも優先されます。Git の情報を提供するために、以下の環境変数を設定します。

DD_GIT_REPOSITORY_URL
コードが格納されているリポジトリの URL。HTTP と SSH の両方の URL に対応しています。
: git@github.com:MyCompany/MyApp.githttps://github.com/MyCompany/MyApp.git
DD_GIT_BRANCH
テスト中の Git ブランチ。タグ情報を指定する場合は、空のままにしておきます。
: develop
DD_GIT_TAG
テストされる Git タグ (該当する場合)。ブランチ情報を指定する場合は、空のままにしておきます。
: 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
ISO 8601 形式のコミット作成者の日付。
: 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
ISO 8601 形式のコミットのコミッターの日付。
: 2021-03-12T16:00:28Z

手動テスト API の使用

RSpec、Minitest、または Cucumber を使用している場合は、手動テスト API を使用しないでください。CI Visibility は自動的にインスツルメンテーションを行い、テスト結果を Datadog に送信するためです。手動テスト API は、すでにサポートされているテストフレームワークと互換性がありません

サポートされていないテストフレームワークを使用している場合や、異なるテストメカニズムを使用している場合のみ、手動テスト API を使用してください。 完全な公開 API ドキュメントは、YARD サイトで入手できます。

ドメインモデル

この API は、テストセッション、テストモジュール、テストスイート、テストの 4 つの概念に基づいています。

テストセッション

テストセッションはテストコマンドの実行を表します。

テストセッションを開始するには、Datadog::CI.start_test_session を呼び出し、Datadog サービスとタグ (使用しているテストフレームワークなど) を渡します。

すべてのテストが終了したら、Datadog::CI::TestSession#finish を呼び出してセッションを終了し、セッションのトレースをバックエンドに送信します。

テストモジュール

テストモジュールは、セッション内のより小さな作業単位を表します。サポートされているテストフレームワークでは、テストモジュールは常にテストセッションと同じです。お客様のユースケースでは、コンポーネント化されたアプリケーション内のパッケージに相当する可能性があります。

テストモジュールを開始するには、Datadog::CI.start_test_module を呼び出し、モジュール名を渡します。

モジュールの実行が終了したら、Datadog::CI::TestModule#finish を呼び出します。

テストスイート

テストスイートは、類似した機能をテストする一連のテストで構成されます。通常、1 つのスイートはテストが定義された 1 つのファイルに対応します。

Datadog::CI#start_test_suite を呼び出してテストスイートの名前を渡すことで、テストスイートを作成します。

スイートの中の関連するテストがすべて実行を終えたら Datadog::CI::TestSuite#finish を呼び出します。

テスト

テストは、テストスイートの一部として実行される単一のテストケースを表します。 通常、テストのロジックを含む 1 つのメソッドに対応します。

Datadog::CI#start_test または Datadog::CI.trace_test を呼び出して、テストの名前とテストスイートの名前を渡すことで、スイート内のテストを作成します。テストスイートの名前は、前のステップで開始したテストスイートの名前と一致させる必要があります。

テストの実行が終了したら、Datadog::CI::Test#finish を呼び出します。

コード例

次のコードは、API の使用例を表しています。

require "datadog/ci"

Datadog.configure do |c|
  c.service = "my-test-service"
  c.ci.enabled = true
end

def run_test_suite(tests, test_suite_name)
  test_suite = Datadog::CI.start_test_suite(test_suite_name)

  run_tests(tests, test_suite_name)

  test_suite.passed!
  test_suite.finish
end

def run_tests(tests, test_suite_name)
  tests.each do |test_name|
    Datadog::CI.trace_test(test_name, test_suite_name) do |test|
      test.passed!
    end
  end
end

Datadog::CI.start_test_session(
  tags: {
    Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-framework",
    Datadog::CI::Ext::Test::TAG_FRAMEWORK_VERSION => "0.0.1",
  }
)
Datadog::CI.start_test_module("my-test-module")

run_test_suite(["test1", "test2", "test3"], "test-suite-name")

Datadog::CI.active_test_module&.passed!
Datadog::CI.active_test_module&.finish

Datadog::CI.active_test_session&.passed!
Datadog::CI.active_test_session&.finish

参考資料