#msbuild #nunit #code-coverage #dotcover
#msbuild #nunit #покрытие кода #dotcover
Вопрос:
Моя организация работает над интеграцией программы запуска консоли dotCover (описанной здесь и здесь) в наш процесс сборки на основе MSBuild с помощью пользовательской задачи MSBuild.
Как и следовало ожидать, мы покрываем запуски NUnit поверх наших сборок модульного тестирования. Хотя мы вполне довольны результатами покрытия, которые генерирует dotCover, мы обнаружили, что наши тесты теперь могут завершаться неудачей, не вызывая сбоя нашей сборки. Один шаг вперед, два шага назад.
dotCover (по крайней мере, то, как мы его запускаем) полностью скрывает результаты защищенного процесса, как вывод на консоль, так и код выхода. Я бы хотел, чтобы в этом отношении он вел себя больше как NCover — повторял весь вывод и код выхода из закрытого процесса.
Кто-нибудь знает, как достичь любого из этих результатов с помощью dotCover console runner? Получение кода выхода из защищенного процесса является наиболее важным, поскольку нам нужно, чтобы наши сборки завершались ошибкой в случае сбоя теста.
Комментарии:
1. Если кто-то с достаточно высокой репутацией ответит на этот вопрос, могу ли я предложить создать тег dotcover? Есть несколько вопросов по SO, которые ссылаются на него.
2. не могли бы вы обойти и повторно пометить упомянутые вопросы для дальнейшего использования?
3. @GregC — спасибо, я добавил этот тег к вопросам dotcover, которые смог найти
Ответ №1:
Мы используем MSBuild и задачи сообщества MSBuild для сбоя сборки.
Вы можете проанализировать сгенерированный dotCover выходной XML-файл, используя задачу XmlRead MSBuild.Задачи сообщества.
<Target Name="DetermineCoverage">
<Message Text="==================================================" />
<Message Text="Determine Unit Test Coverage" />
<XmlRead
XPath="/Root/@CoveragePercent"
XmlFileName="dotCoverOutput.xml">
<Output TaskParameter="Value" PropertyName="CoveragePercent"/>
</XmlRead>
<Message Text="==" />
<Message Text="== Coverage Percentage $(CoveragePercent)" />
<Error
Text="Unit Test coverage did not exceed the desired threshold"
Condition="$(CoveragePercent) amp;< 90" />
<Message Text="==================================================" />
</Target>
Ответ №2:
Я столкнулся с той же проблемой.
Альтернативный обходной путь — сначала запустить модульные тесты с помощью тестового модуля за пределами dotCover. Это предоставит правильные коды возврата.
А затем, в качестве второго шага, запустите dotCover, чтобы получить результаты покрытия.
Надеюсь, это кому-нибудь поможет.
Ответ №3:
Поскольку мне нужно было быстро найти обходной путь, я добавил этап постобработки, чтобы очистить XML-файл NUnit, созданный во время запуска dotCover, от сбоев тестового примера, и я завершаю сборку, если нахожу таковые. Я сделал это с помощью простой пользовательской задачи MSBuild:
public class CheckNUnitResults : Task
{
[Required]
public string ResultFile { get; set; }
public override bool Execute()
{
Log.LogMessageFromText("Analyzing nunit results : " ResultFile, MessageImportance.Normal);
var failedCases =
XDocument
.Load(ResultFile)
.Descendants("test-case")
.Where(xe => xe.Attribute("success").Value.Equals("False"));
var fail = failedCases.Any();
if (fail)
{
Log.LogError("Found test case failures : "
string.Join(", ", failedCases
.Select(xe => xe.Attribute("name").Value)
.ToArray()));
}
return !fail;
}
}
Это вызывается из MSBuild таким образом:
<CheckNUnitResults ResultFile="YourNUnitResultFile.xml" />
(Я вызываю его в цикле над ItemGroup, содержащей мои файлы результатов)