【问题标题】:OpenCover results not matching TFS numbersOpenCover 结果与 TFS 编号不匹配
【发布时间】:2013-09-08 18:09:36
【问题描述】:

我们有 VS 2008 项目 (asp.net)。它在 TFS 下。我们已经使用模拟框架(nunit?)编写了单元测试。开发人员可以在他们的机器上执行测试并查看代码覆盖率。

现在,我们已将解决方案升级到 VS 2012 专业版。作为专业版,它不支持执行代码覆盖,所以我冒险尝试了 OpenCover。

问题是在通过 TFS 构建时,代码分析显示代码覆盖率为 24%,但是当我在开发人员机器上本地执行 OpenCover 时,它显示的数字完全不同。我们需要针对 TFS 报告的内容,因为它由或组织自动 ALM 合规引擎监控,开发人员需要注意 TFS 代码覆盖率不低于 X。

我的 OpenCover 语法是:

OpenCover.Console.exe -register:user -target:"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\MSTest.exe" -targetargs:"/noisolation /testcontainer:"C:\code\APRRel\UnitTest\bin\Debug\unittest.dll" /resultsfile:C:\Reports\MSTest\APRRel.trx" -filter:"+[*]*" -mergebyhash -output:C:\Reports\MSTest\projectCoverageReport.xml

这是我的 TFS 和 OpenCover 输出:

我怎样才能让 opencover 报告与 TFS 相似的统计数据?

【问题讨论】:

  • 默认情况下,Vs2012 将测试包含在覆盖范围内,人为地提高了结果。
  • @bryanbcook 你能详细说明一下吗?您的意思是 VS2012/TFS 将我的单元测试类本身也计入代码覆盖率吗?如果是这样,这就是我目前的 opencover 似乎也在做的事情。

标签: unit-testing visual-studio-2012 tfs mstest opencover


【解决方案1】:

正如他们所说,您正在尝试将苹果与梨进行比较。这两个工具是不同的,它们有不同的检测代码的方式。 ReportGenerator 中显示的数字也是基于覆盖的行数。 OpenCover 根据序列点的数量有不同的数量(这不是 1:1 的关系,更多的是 n:m 的行)。

如果您打开实际的 opencover 输出,您会在顶部附近看到这样的摘要行

<Summary numSequencePoints="895" visitedSequencePoints="895" numBranchPoints="537" visitedBranchPoints="455" sequenceCoverage="100" branchCoverage="84.73" maxCyclomaticComplexity="8" minCyclomaticComplexity="0" />

序列覆盖率是您要查看的指标,因为此指标可能是 VS 覆盖率所指的基于块的,但由于不同的检测实践(苹果与梨),这两种工具可能会有所不同。

接下来您需要考虑您的过滤器,+[*]* 将包含所有具有 PDB 文件的程序集。尝试使用以下过滤器 +[*]* -[*.Tests]* 排除您的测试程序集 - 假设您的测试程序集以 .Tests 结尾。

但是,IMO,如果您希望您的开发人员知道构建系统上的覆盖范围与桌面相同,那么他们确实应该在两个位置和相同的配置中运行相同的工具; debugrelease 覆盖率可能会因编译器创建不同的 IL 而有所不同,这会影响检测并因此影响数字,但它们通常在 0-2% 范围内,具体取决于您的代码库。

【讨论】:

  • 你能解释一下“序列覆盖”是什么意思吗?
  • 对我来说,序列覆盖是关于访问通过 PDB (msdn.microsoft.com/en-us/library/…) 公开的序列点 - 通常如果你可以在那里放置一个断点,它将是一个序列点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多