dotCover dotCover ランナーは、 JetBrains dotCover を使用して .NET プロセスのカバレッジレポートを生成します。 生成されたレポートは、ビルド結果ページの コードカバレッジタブ に公開されます。
このランナーは、複数の先行する .NET ステップの後に配置して、個々のコードカバレッジをマージし、統合レポートを公開することもできます。
dotCover ステップ設定 このセクションでは、ランナー設定の使用方法について説明します。 現在のタスクに応じてこれらの設定を組み合わせる方法の例については、以下のセクションを参照してください。
dotCover ツール - dotCover のプリインストール版または カスタム 版を選択します。
dotCover 2025.2 では、現在のどの TeamCity バージョンともまだ互換性のない新しい構文が導入されています。 今後のリリースで、このツールを利用する TeamCity ランナー(dotCover 、 .NET 、 NUnit )を更新する予定です。
それまでは、エージェントに dotCover 2025.2 をインストールし、「dotCover バージョン」ランナー設定の <カスタム> オプションで選択しないでください。 代わりに、バージョン 2025.1.7 クロスプラットフォーム、または TeamCity インストールにバンドルされているいずれかのバージョンを使用してください。
実行可能ファイル と コマンドライン引数 — dotCover カバレッジプロファイルで必要な引数を指定してカスタムプロセスを実行できるようにするオプション設定です。 実行可能ファイル フィールドでは、プロファイリング対象のプロセスを生成するオブジェクトへのパスを指定できます (たとえば、.NET CLI や dotCover ツール自体の .exe/.dll へのパス)。 このステップを使用して、先行する dotCover 、 .NET 、または NUnit ランナーによって生成されたスナップショットをマージする場合は、これらの設定を空のままにします。
カバレッジレポートを生成 — ビルド結果ページの コードカバレッジ タブに生成されたコードカバレッジレポートのデータを表示するかどうかを指定します。
ビルド結果ページでレポートを公開する必要がない場合は、この設定をオフのままにしておきます。 例: 生成された .html および .dcvr ファイルを ビルドアーティファクトとして 公開し、他の場所で使用する場合。
追加の dotCover スナップショットをレポートに含める — ランナーが最終的なカバレッジレポートを生成するために使用する .dcvr スナップショットへのパス。 複数の .dcvr ファイルを指定し、 実行可能ファイル 設定を空のままにできます。 この場合、dotCover はこれらのスナップショットをマージしたレポートを生成します。
dotCover は、前の dotCover および .NET ステップからスナップショットを自動的に収集するため、必要なすべてのスナップショットが同じ構成で作成される限り、これらのルールを定義する必要がないことに注意してください。 この設定では、 アーティファクト依存関係 経由でインポートされたスタンドアロン構成からスナップショットを含めることができます。
詳細設定 アセンブリフィルター — コードカバレッジにアセンブリを含めるには「+:assemblyName」と入力し、コードカバレッジにアセンブリを除外するには「-:assemblyName」と入力します。
属性フィルター — この属性でマークされたコードをコードカバレッジから除外するには、「-:attributeName」と入力します。
追加引数 — dotCover カバー コマンドの追加のコマンドライン引数のリスト。
例: 統合レポートの生成 dotCover ランナーは、必要なプロジェクトをテストし、コードカバレッジレポートを生成するワンストップショップとして使用できます。 次の Kotlin DSL サンプルは、このセットアップを示しています。
// Launching .NET to test a project and generate a report
object MyConfig : BuildType({
steps {
dotCover {
name = "dotCover step with .Net test"
id = "dotcover"
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
executable = "%DotNetCLI_Path%"
commandLineArguments = """test %teamcity.build.checkoutDir%\ProjectA\proj_A.csproj"""
}
}
})
// Launching .NET to test a project and generate a report
object MyConfig : BuildType({
steps {
dotCover {
id = "dotcover"
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
executable = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%/dotCover.dll"
commandLineArguments = "dotnet --targetWorkingDir=%teamcity.build.checkoutDir% -- test ./ProjectA/proj_A.csproj"
}
}
})
ただし、この単純なシナリオでは、最終結果は、設定で dotNet カバレッジを有効にして .NET ステップを実行した場合と似ています。 dotCover dotCover の真の強みは、さまざまなソースからスナップショットを収集し、結合されたコードカバレッジレポートを生成する機能にあります。 以下のサンプルは、これらのスナップショットの正確なソースに応じて dotCover ランナーを設定する方法を示しています。
単一のビルド構成から 以下のサンプル構成には、異なるプロジェクトをテストする複数の .NET ステップが含まれています。 これらの各ステップでは、 コードカバレッジ で「JetBrains dotCover」が選択されています。 最後の dotCover ステップでは、独自のスナップショットは生成されません。 代わりに、すべての .NET ランナーのスナップショットを収集して、 コードカバレッジタブ に公開される最終的な統合レポートを作成します。
このセットアップでは、 カバレッジレポートを生成 オプションを選択することのみが必要で、他のランナー設定は空のままです。
import jetbrains.buildServer.configs.kotlin.*
import jetbrains.buildServer.configs.kotlin.buildSteps.dotCover
object ConsolidatedReport : BuildType({
id("consolidatedreport")
name = "Code coverate report merged from three .NET steps"
steps {
dotnetTest {
id = "dotnet"
projects = "projectA/proj_A.csproj"
sdk = "6"
coverage = dotcover {
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
}
}
dotnetTest {
id = "dotnet_1"
projects = "projectB/proj_B.csproj"
sdk = "6"
coverage = dotcover {
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
}
}
// More .NET runners that test separate projects and generate dotCover snapshots
dotCover {
id = "dotcover"
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
}
}
})
ビルドチェーンから 以下の ビルドチェーン には、2 つの構成が含まれています。
import jetbrains.buildServer.configs.kotlin.*
import jetbrains.buildServer.configs.kotlin.buildSteps.dotCover
object ConfigA : BuildType({
name = "Configuration A: Test with code coverage and publish snapshots"
// Publish snaphots
// Note that the path to the snapshot directory may vary depending on the runner type and/or settings
// For example, for NUnit runner use "%teamcity.agent.work.dir%\..\temp\agentTmp\dotNetCoverageResults\*.dcvr" instead
artifactRules = """%teamcity.agent.work.dir%\..\temp\agentTmp\*.dcvr"""
steps {
dotnetTest {
id = "dotnet"
projects = "projectA/proj_A.csproj"
sdk = "6"
coverage = dotcover {
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
}
}
dotnetTest {
id = "dotnet_1"
projects = "projectB/proj_B.csproj"
sdk = "6"
coverage = dotcover {
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
}
}
// ...
// More .NET runners that test separate projects and generate dotCover snapshots
}
})
import jetbrains.buildServer.configs.kotlin.*
import jetbrains.buildServer.configs.kotlin.buildSteps.dotCover
object ConfigB : BuildType({
name = "Configuration B: Test with code coverage, import snapshots, and publish report"
steps {
dotnetTest {
id = "dotnet"
projects = "projectC/proj_C.csproj"
sdk = "6"
coverage = dotcover {
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
}
}
dotCover {
id = "dotcover"
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
executable = "%DotNetCLI_Path%"
commandLineArguments = "test ./ProjectD"
snapshotPaths = "%teamcity.build.workingDir%/*.dcvr"
}
}
dependencies {
artifacts(Build) {
buildRule = lastSuccessful()
cleanDestination = true
artifactRules = "+:*.dcvr"
}
}
})
並列テストから .NET ランナーは、 並列テスト ビルド機能を使用して、巨大なテストスイートを個別のバッチに分割し、異なるエージェントで実行することができます。 並列テストを含む構成に dotCover ステップを追加した場合、個別のバッチを実行する個別のビルドによって生成されたスナップショットはマージされません。 各個別のビルドは、ビルド結果ページの 概要 タブに独自の結果を表示し、統合レポートを含む コードカバレッジ タブは表示されません。
統合レポートが必要な場合は、 ビルドチェーンから セクションに示されているものと同様のソリューションを使用できます: すべてのバッチからスナップショットを収集し、単一のレポートにマージする依存ビルド構成を作成します。
この使用例の違いは、スナップショットをアーティファクトとして公開する前にスナップショットの名前を変更する必要があることです。 それ以外の場合、各並列ビルドは同一の設定を持つため、スナップショットの名前は同一になり、より高速な並列ビルドの後に終了する各ビルドはそのアーティファクトをオーバーライドします。 詳細については、次のセクションを参照してください: バッチビルドで生成されたアーティファクトを公開
// Primary build configuration
// Performs actual tests and generates coverage snapshots
object PrimaryConfig : BuildType({
id = AbsoluteId("ConfigA")
name = "Build"
// use build.parallelTests parameter to generate unique artifact names
artifactRules = """%teamcity.agent.work.dir%\..\temp\agentTmp\*.dcvr => Snapshot_%teamcity.build.parallelTests.currentBatch%"""
steps {
dotnetTest {
id = "dotnet_1"
projects = "ProjectA/proj_A.csproj"
sdk = "6"
coverage = dotcover {
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
}
}
// .NET runners that test separate projects and generate dotCover snapshots
}
features {
parallelTests {
numberOfBatches = 2
}
}
})
// Dependent build configuration
// Retrieves snapshots from parallel builds and produces a consolidated report
object DotCoverReportConfig : BuildType({
id = AbsoluteId("ConfigB")
name = "dotCover Report"
steps {
dotCover {
id = "dotcover"
toolPath = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.DEFAULT%"
snapshotPaths = "%teamcity.build.workingDir%/*/*.dcvr"
}
}
dependencies {
artifacts(DotCoverRunner_ParallelTestsWithOneCommonCoverageReport_Build) {
buildRule = lastSuccessful()
cleanDestination = true
artifactRules = "+:*/*.dcvr"
}
}
})
2026 年 9 月 11 日