dotCover
dotCover 运行器使用 JetBrains dotCover 为 .NET 进程生成覆盖率报告。 生成的报告将发布到构建结果页面的 Code Coverage tab 。
这个运行器也可以放在多个前置 .NET 步骤后,以合并它们各自的代码覆盖率并发布综合报告。
dotCover 步骤设置 这一部分解释了如何使用 runner 设置。 请参考以下部分的示例,了解如何根据您当前的任务组合这些设置。
dotCover 工具 — 选择预装的或者自定义 的 dotCover 版本。
可执行文件 与命令行参数 —— 这些是可以让您在 dotCover 覆盖率配置文件下,运行带有所需参数的自定义进程的可选设置。 Executable 字段接受一个对象的路径,该对象生成要分析的进程(例如,到 .NET CLI 或 dotCover 工具本身的 .exe/.dll)。 如果您使用此步骤来合并由前面的 dotCover ,.NET 或 NUnit 运行器生成的快照,那么请将这些设置留空。
生成覆盖率报告 — 指定构建结果页面是否应在其 代码覆盖率 标签页中显示生成的代码覆盖率报告的数据。
如果您不需要在构建结果页上发布报告,请不要勾选此设置。 例如,如果您打算发布生成的 .html 和 .dcvr 文件 作为构建成品 并在其他地方使用它们。
将额外的 dotCover 快照包含到报告中 — 这是运行器应用以生成最终覆盖报告的 .dcvr 快照路径。
请注意,由于 dotCover 会自动从前面的 dotCover 和 .NET 步骤中收集快照,只要所有需要的快照都在同一配置中生成,您就无需定义这些规则。 这个设置允许您包含通过 artifact dependencies 导入的独立配置中的快照。
高级设置 装配过滤器 — 输入 "+: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 运行器。
从单一构建配置 下面的示例配置包含多个 .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%"
}
}
})
来自构建链 下面的 构建链 包含两个配置。
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"
}
}
})
最后修改日期: 16日 7月 2024年