无法获取 Gradle OpenCover 插件来生成覆盖率结果

Can't get Gradle OpenCover plugin to produce coverage results

我没有从 opencover 获得任何结果。我的 nunit 测试所有 运行 并通过,只是没有覆盖结果。问题似乎是 opencover 过滤器,但我们没有设置任何过滤器。有什么建议吗?

CodeCoverage.xml 文件包含一组如下所示的行,表明插件告诉 opencover 过滤掉我们试图测量的 DLL。

<Module hash="A3-F0-3A-1A-FF-38-D7-EF-A2-55-C9-8B-84-37-CF-CF-00-80-70-23" skippedDueTo="Filter">
<FullName>C:\gitlab-runner\buildsebc972[=11=]\active\scrpt\output\Scrpt.Core.dll</FullName>
<ModuleName>Scrpt.Core</ModuleName>
<Classes/></Module>

其中有正确的 dll 文件路径,但我不明白为什么它会因过滤而被跳过。单元测试包含在一个名为 Scrpt.Test.dll 的 dll 中,其余代码在其他 DLL 中,所有这些都被过滤掉了。

我正在使用以下插件

plugins {
  id 'com.ullink.msbuild' version '2.15'
  id 'com.ullink.nunit' version '1.8'
  id 'com.ullink.opencover-nunit' version '1.6'
}

nunit 和 opencover 的插件定义是:

nunit {
  testAssemblies = [file('output/Scrpt.Tests.dll')]
  shadowCopy = false
  useX86 = true
  ignoreFailures = false
}

opencover {
  targetAssemblies = [file('output/Scrpt.dll'),file('output/Scrpt.Core.dll'),file('output/Scrpt.SourceCitations.dll'),file('output/ScrptUtilLib.dll')]
  ignoreFailures = false
}

感谢您的帮助, -药草

https://github.com/Ullink/gradle-opencover-plugin/issues/17

的 Francois Valdy 的帮助下回答了这个问题

问题原来是 opencover 插件没有生成 coverage.xml 结果。 xml 中有一条错误消息说我感兴趣的文件因过滤器而被跳过,但我找不到导致这种情况的过滤器。

我最终用执行相同操作的任务替换了 opencover 插件。不知道为什么插件不起作用,但替换本质上是相同的,因为它调用 nunit,创建输出覆盖 xml,然后 sonarqube 上传。另外,这样做可以让您更好地控制文件的最终位置。

有点笨拙,但它有效。以下内容替换了我原来问题中的 opencover 块。

task opencover(type:Exec) {
 executable 'C:\Program Files (x86)\OpenCover\OpenCover.Console.exe'
 workingDir file('output')
 args "-target:c:\Program Files (x86)\NUnit 2.6.4\bin\nunit-console-x86.exe", "-targetargs:c:\gitlab-runner\builds\83ebc972\0\active\scrpt\output\scrpt.tests.dll /noshadow", '-output:coverage.xml', '-filter:+[*]*'
}

顺便说一句,我确实尝试替换 file() 在 targetAssemblies 中用于 opencover gradle 插件,但这没有效果。根据我的阅读,以下内容应该有效。

opencover {
  targetAssemblies = ['output/Scrpt.dll','output/Scrpt.Core.dll','output/Scrpt.SourceCitations.dll','output/ScrptUtilLib.dll']
  ignoreFailures = false
}

需要设置一个 opencover 过滤器。开盖过滤器适用于包容性和排他性过滤器。

第一个过滤器应始终类似于:

+[*]*

意思是包括每个程序集和每个 class。 然后添加您的专属过滤器: +[*]* -[AssemblyName]* -[*AnotherName]*

很简单。只需先添加通用包容性过滤器,获取结果,然后开始逐步排除过滤器中的内容。