首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Coverlet的Dotnet单元测试-如何覆盖整个解决方案,而不仅仅是一个项目

使用Coverlet的Dotnet单元测试-如何覆盖整个解决方案,而不仅仅是一个项目
EN

Stack Overflow用户
提问于 2018-11-12 09:50:04
回答 6查看 6.1K关注 0票数 22

我们使用coverlets (https://github.com/tonerdo/coverlet)来度量包含多个项目的.NET解决方案中单元测试的代码覆盖率。结果将分别显示在解决方案中的每个项目中。我们想要的是整个解决方案的统一结果。有没有人能建议一下最好的方法呢?如果coverlet不可能做到这一点,您可以建议使用CLI的其他开源工具来实现这一点吗?我们基本上需要将其与CI工具集成,如果覆盖率低于阈值,该工具应发出警告。

EN

回答 6

Stack Overflow用户

发布于 2019-05-24 02:34:04

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

解决方案中每个测试项目中的

  1. 引用coverlet.msbuild
  2. 在CI脚本中,导航到包含解决方案文件的目录。然后,
  3. 运行与以下命令类似的命令(语法为bash)

代码语言:javascript
复制
dotnet test {solution_filename.sln} --logger:trx --results-directory ../TestResults \
   "/p:CollectCoverage=true" \
   "/p:CoverletOutput=../TestResults/" \
   "/p:MergeWith=../TestResults/coverlet.json" \
   "/p:CoverletOutputFormat=\"json,cobertura\"" 

如果在Windows上运行,您可能需要转义传递给这些参数的一些字符,例如逗号(%2c)。

为了跨多个项目合并结果,我们生成了两种输出格式: json和cobertura。请参见参数/p:CoverletOutputFormat

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

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

票数 14
EN

Stack Overflow用户

发布于 2021-01-24 13:34:24

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

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

下面是我们在CI中如何做到这一点:

代码语言:javascript
复制
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

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

票数 8
EN

Stack Overflow用户

发布于 2021-03-21 08:17:47

最近我遇到了同样的问题,Joel answer工作得很好。除非您需要xml而不是json。在这种情况下,您必须一个接一个地运行测试项目,生成json输出并与前一个合并,但以您需要的格式运行最后一个。

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

代码语言:javascript
复制
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中运行它,我的文件夹结构可能看起来有点混乱=)。这里是,为了避免任何混淆:

代码语言:javascript
复制
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)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53255065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档