使用Coverlet进行点网单元测试-如何获得整个解决方案的覆盖范围,而不仅仅是一个项目

时间:2018-11-12 01:50:04

标签: .net unit-testing

我们正在使用Coverlet(https://github.com/tonerdo/coverlet)来衡量包含多个项目的.NET解决方案中单元测试的代码覆盖率。结果将分别显示在解决方案中的每个项目中。我们想要的是为整个解决方案提供统一的结果。 谁能建议最好的方法来做到这一点? 如果有可能通过Coverlet无法完成,您可以建议使用CLI进行此操作的任何其他开源工具。我们本质上需要将其与CI工具集成在一起,如果覆盖率低于阈值,则会发出警告。

4 个答案:

答案 0 :(得分:3)

如果您使用coverage.collector,它将为每个项目生成单独的测试结果文件。

然后您可以使用 reportgenerator 工具将多个结果合并为一个。

以下是我们在 CI 中的做法:

dotnet test <solution-file> --collect:"XPlat Code Coverage"
dotnet tool install --global dotnet-reportgenerator-globaltool --version <version-number>
reportgenerator -reports:<base-directory>/**/coverage.cobertura.xml -targetdir:<output-directory>/CoverageReport -reporttypes:Cobertura

这将为您的所有测试项目生成一份综合报告。

答案 1 :(得分:1)

最近我遇到了同样的问题,乔尔的回答完美无缺。除非你需要 xml 而不是 json。在这种情况下,您必须一个一个地运行测试项目,生成 json 输出并与前一个合并,但以您需要的格式运行最后一个。

这是我如何做到的一个例子:

RUN dotnet test "tests/[project name].Test.Integration/[project name].Test.Integration.csproj" \
    --configuration Release \
    --no-restore \
    --no-build \
    --verbosity=minimal \
    -p:CollectCoverage=true \
    -p:CoverletOutputFormat="json" \
    -p:CoverletOutput=/src/cover.json

RUN dotnet test "tests/[project name].Test.Unit/[project name].Test.Unit.csproj" \
    --configuration Release \
    --no-restore \
    --no-build \
    --verbosity=minimal \
    -p:CollectCoverage=true \
    -p:CoverletOutputFormat="opencover" \
    -p:CoverletOutput=/src/cover.xml \
    -p:MergeWith=../../cover.json

我在 Docker 中运行它,我的文件夹结构可能看起来有点混乱 =)。这是为了避免混淆:

src
---src
---tests
------[project name].Test.Integration
---------[project name].Test.Integration.csproj
------[project name].Test.Unit
---------[project name].Test.Unit.csproj
---[project name].sln
---cover.json <- this file gets created after the first command
---cover.xml <- this file gets created after the second command

所以我首先为我的集成测试运行覆盖率,然后我将它与所需格式的单元测试覆盖率合并(因为我需要它用于 SonarQube)

答案 2 :(得分:0)

这就是我们使用coverlet.msbuild为整个解决方案生成代码覆盖率的方式。

  1. 解决方案中每个测试项目中的参考文献coverlet.msbuild
  2. 在CI脚本中,导航到包含解决方案文件的目录。然后,
  3. 运行类似于以下命令(语法为bash)
dotnet test ##solution_filename## --logger:trx --results-directory ../TestResults \
   "/p:CollectCoverage=true" \
   "/p:CoverletOutput=../TestResults/" \
   "/p:MergeWith=../TestResults/coverlet.json" \
   "/p:CoverletOutputFormat=\"json,cobertura\"" 

要合并多个项目中的结果,我们生成两种输出格式:json和cobertura。请参阅参数/p:CoverletOutputFormat

在为每个项目生成代码覆盖率时,coverlet将使用/p:MergeWith将当前项目的coverlet.json与先前的coverlet.json合并。

这种方法为解决方案生成了一个cobertura结果文件,供以后在CI构建中使用。

答案 3 :(得分:0)

仅当您以顺序方式运行构建/测试时,此方法才有效,作为参考,我将链接回购https://github.com/tonerdo/coverlet/issues/598#issuecomment-551174529上的讨论