在 JetBrains TeamCity 上设置覆盖率
通常,.NET 解决方案的持续集成 (CI) 构建由一系列任务组成,这些任务包括编译和运行测试。 在 JetBrains TeamCity CI 服务器中,这些任务被称为构建步骤。 由于 TeamCity 自带 dotCover 命令行工具 ,您只需启用相应的构建步骤选项即可收集代码覆盖率数据。 TeamCity 收集的覆盖率结果可以在 TeamCity 内查看为报告,或者下载为 覆盖率快照 并在 Visual Studio 中查看。
例如,我们有一个由两个项目组成的简单解决方案:一个是应用程序,另一个是测试程序集。 我们的任务是设置持续集成构建,编译应用程序,运行测试,并收集测试覆盖率统计数据。 请注意,工作流程因您使用的单元测试运行器而异:
MSTest/NUnit
MSTest 和 NUnit 测试运行器由 TeamCity 开箱即用提供,因此,通常您只需添加一个带有相应运行器的构建步骤。
在 TeamCity 中设置 MSTest/NUnit 测试的覆盖率分析
在 TeamCity 中,创建一个 新构建项目并设置 VCS 根。 然后添加一个新的构建步骤:在项目中创建一个 新项目和一个 新构建配置。
添加第一个构建步骤,该步骤将构建解决方案和测试。 在我们的特定示例中,我们使用 .NET 运行器(需要在构建代理上安装以下 软件 ),但您还有许多其他构建选项:直接运行 MSBuild、运行批处理文件等。

请注意,我们在这里所做的只是构建解决方案。 尚未设置覆盖率。
添加一个运行测试的构建步骤。 如果您使用 MSTest 测试,请选择带有 `vstest` 作为 命令 的 .NET 运行器。 我们的示例解决方案使用 NUnit 测试,因此我们选择 NUnit 运行器。 在这里,我们还指定了 NUnit 版本、.NET 运行时参数和测试程序集的路径。

现在,是时候设置覆盖率了。 在 .NET 覆盖工具 中,选择 JetBrains dotCover。

在 程序集过滤器 中,添加您想要覆盖的程序集(仅需程序集名称),并在前面加上
+:,过滤掉您不想覆盖的程序集,使用–:。 在我们的示例中,我们排除了包含运行测试的MainTests程序集。保存配置并运行它以查看效果。
构建完成后, 概览 选项卡将包含关于代码覆盖率的简短报告。

要查看详细信息,请切换到 代码覆盖率 选项卡。 在这里,您可以查看测试覆盖了多少类/方法的详细统计信息。

甚至可以深入到单个类并检查代码覆盖率。

构建产物现在包含压缩的覆盖率文件。

请注意,在实际环境中,您可能有两个不同的构建配置:一个用于构建二进制文件,另一个用于收集代码覆盖率。 在这种情况下,您应该使用快照依赖项,以便第二个构建配置可以找到源文件。 否则,在尝试查看源代码时,您将看到
Source code is not available消息。
要解决此问题,请按照 TeamCity 文档 中的说明操作。
xUnit
运行和获取 xUnit 测试覆盖率的主要问题是 TeamCity 并未开箱即用支持 xUnit。 这会产生两个必须解决的问题:
必须提供 xUnit 包以构建解决方案。
将二进制库提交到 VCS 不是一个好的做法,因此,在编译阶段之前,恢复包必须是一个单独的构建步骤。
必须手动提供并运行 xUnit 测试运行器。
好消息是:
运行器作为 NuGet 包分发,因此可以直接在您的解决方案中引用,然后在构建期间恢复(参见 a)。
无需额外操作即可获取测试结果,因为运行器以 TeamCity 服务消息的格式提供结果。
在 TeamCity 中设置 xUnit 测试的覆盖率分析
在 Visual Studio 中,打开您的解决方案。 在测试项目中,添加对
xunit.runner.consoleNuGet 包的引用。
在 TeamCity 中,创建一个 新构建项目并设置 VCS 根。 然后添加一个新的构建步骤:在项目中创建一个 新项目和一个 新构建配置。
确保 TeamCity 被配置为 NuGet 服务器:在 中找到 NuGet.exe 表,并检查是否包含所需的 NuGet 版本。 如果没有这样的表,请通过点击 安装工具... 按钮并按照所需步骤将 NuGet 添加到 TeamCity。

添加一个构建步骤,用于恢复解决方案引用的 NuGet 包。 使用 NuGet 安装程序 作为 运行器类型。

添加第一个构建步骤,该步骤将构建解决方案和测试。 在我们的特定示例中,我们使用 .NET 运行器(需要在构建代理上安装以下 软件 ),但您还有许多其他构建选项:直接运行 MSBuild、运行批处理文件等。

请注意,我们在这里所做的只是构建解决方案。 尚未设置覆盖率。
添加一个运行测试的构建步骤:
由于 xUnit 运行器将作为一个简单的 .exe 文件执行,请选择 .NET 运行器。
在 命令 中,选择 <custom>。
由于运行器作为解决方案中的一个包提供,您可以相对于解决方案工作目录指定其路径,例如:
%system.teamcity.build.workingDir%\SimpleTestsProject\packages\xunit.runner.console.2.3.1\tools\net452\xunit.console.exe命令行形参 字段必须包含已编译测试程序集的路径。

现在,是时候设置覆盖率了。 在 .NET 覆盖工具 中,选择 JetBrains dotCover。

在 程序集过滤器 中,添加您想要覆盖的程序集(仅需程序集名称),并在前面加上
+:,过滤掉您不想覆盖的程序集,使用–:。 在我们的示例中,我们排除了包含运行测试的MainTests程序集以及与 xUnit 程序集相关的所有内容。保存配置并运行它以查看效果。
构建完成后, 概览 选项卡将包含关于测试结果和代码覆盖率的简短报告。

要查看详细信息,请切换到 代码覆盖率 选项卡。 在这里,您可以查看测试覆盖了多少类/方法的详细统计信息。

甚至可以深入到单个类并检查代码覆盖率。

构建产物现在包含压缩的覆盖率文件。
MSpec
MSpec 部分由 TeamCity 开箱即用支持:它有一个相应的构建步骤运行器,但 MSpec 测试运行器不在捆绑包中,必须手动安装到 TeamCity 代理。 幸运的是,运行器作为 NuGet 包分发,因此可以直接在您的解决方案中引用,然后在构建期间恢复。
在 TeamCity 中设置 MSpec 测试的覆盖率分析
在 Visual Studio 中,打开您的解决方案。 在测试项目中,添加对
Machine.Specifications.Runner.ConsoleNuGet 包的引用。
在 TeamCity 中,创建一个 新构建项目并设置 VCS 根。 然后添加一个新的构建步骤:在项目中创建一个 新项目和一个 新构建配置。
确保 TeamCity 被配置为 NuGet 服务器:在 中找到 NuGet.exe 表,并检查是否包含所需的 NuGet 版本。 如果没有这样的表,请通过点击 安装工具... 按钮并按照所需步骤将 NuGet 添加到 TeamCity。

添加一个构建步骤,用于恢复解决方案引用的 NuGet 包。 使用 NuGet 安装程序 作为 运行器类型。

添加第一个构建步骤,该步骤将构建解决方案和测试。 在我们的特定示例中,我们使用 .NET 运行器(需要在构建代理上安装以下 软件 ),但您还有许多其他构建选项:直接运行 MSBuild、运行批处理文件等。

请注意,我们在这里所做的只是构建解决方案。 尚未设置覆盖率。
添加一个运行测试的构建步骤:
在 运行器类型 中选择 MSpec。
由于运行器作为解决方案中的一个包提供,您可以相对于解决方案工作目录指定其路径,例如:
%system.teamcity.build.workingDir%\SimpleTestsProject\packages\Machine.Specifications.Runner.Console.0.9.3\tools\mspec-clr4.exe确保您使用的运行器版本与项目目标 .NET Framework 版本相对应。
在 从此处运行测试 中,指定已编译测试程序集的路径。
如果需要,请在 包含规范 和 排除规范 中指定必须包含/排除的规范。

现在,是时候设置覆盖率了。 在 .NET 覆盖工具 中,选择 JetBrains dotCover。

在 程序集过滤器 中,添加您想要覆盖的程序集(仅需程序集名称),并在前面加上
+:,过滤掉您不想覆盖的程序集,使用–:。 在我们的示例中,我们排除了包含运行测试的MSpecTests程序集以及与 MSpec 程序集相关的所有内容。保存配置并运行它以查看效果。
构建完成后, 概览 选项卡将包含关于测试结果和代码覆盖率的简短报告。

要查看详细信息,请切换到 代码覆盖率 选项卡。 在这里,您可以查看测试覆盖了多少类/方法的详细统计信息。

甚至可以深入到单个类并检查代码覆盖率。

构建产物现在包含压缩的覆盖率文件。