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