Не удается получить плагин Gradle OpenCover для получения результатов покрытия

#sonarqube #nunit #gradle-plugin #sonarqube-scan #opencover

#sonarqube #nunit #gradle-плагин #sonarqube-сканирование #opencover

Вопрос:

Я не получаю никаких результатов от opencover. Все мои тесты nunit выполняются и проходят, просто нет результатов покрытия. проблема, похоже, в фильтрах открытого покрытия, но мы их не устанавливаем. Есть предложения?

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-runnerbuilds83ebc972activescrptoutputScrpt.Core.dll</FullName>
<ModuleName>Scrpt.Core</ModuleName>
<Classes/></Module>
  

который имеет правильный путь к файлу dll, но я не понимаю, почему он пропущен из-за фильтрации. Модульные тесты содержатся в dll с именем Scrpt.Test.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
}
  

Спасибо за вашу помощь,
-herb

Ответ №1:

Вам необходимо установить фильтр opencover. Фильтр Open cover работает с включающими и эксклюзивными фильтрами.

Первый фильтр всегда должен быть чем-то вроде :

  [*]*
  

значение включает каждую сборку и каждый класс.
затем добавьте свои эксклюзивные фильтры:
[*]* -[AssemblyName]* -[*AnotherName]*

Это очень просто. сначала просто добавьте универсальный инклюзивный фильтр, получите свои результаты, а затем начните постепенно исключать элементы в вашем фильтре один за другим.

Ответ №2:

Ответ на этот вопрос был получен с помощью Франсуа Вальди по адресу https://github.com/Ullink/gradle-opencover-plugin/issues/17

Проблема оказалась в том, что плагин 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
}