Состояние ошибки перехвата в MSBuild

В рамках некоторых автоматизация сборки запуска тестов xUnit.net с помощью MSBuild, я столкнулся с ситуацией, когда мне нужно перебрать пакет элементов.

Внутри цикла мне нужно определить, не удалось ли выполнить итерацию, но я хочу продолжить выполнение независимо от этого. Затем после пакетного бита мне нужно знать, произошла ли одна или несколько ошибок, чтобы сообщить о результате в TeamBuild.

IOW в псевдокоде:

Task Name=RunTests
  CreateItems
  ForEach item CallTarget Target=RunTest ContinueOnError=true
  CombineNUnitResults
  Report success/failure

Task Name=RunTest
   XUnit item

Я надеюсь, что этого можно добиться без специальной задачи (или взлома задачи xunit.net MSBuild, как это сделал Йонне). (Но готовы использовать MSBuild Community или задачи Sdc)

И @BradWilson: Я не могу сделать это чисто, я буду искать изменения Йонне а-ля задача NUnit, чтобы они также были включены в задачу xunit

См. Также: Как заставить Team Build показывать результаты тестирования и покрытие для набора тестов xUnit.net?


person Ruben Bartelink    schedule 29.06.2009    source источник


Ответы (2)


Скачайте 1.5 Beta. Мы исправили это, добавив выходной параметр ExitCode в нашу задачу xunit MSBuild!

http://xunit.codeplex.com/Release/ProjectReleases.aspx

person Brad Wilson    schedule 09.08.2009
comment
Спасибо, Брэд, я тоже его там отслеживал. - person Ruben Bartelink; 12.08.2009

Это то, что мы делаем:

<NUnit Assemblies="@(TestAssemblies)"
    ToolPath="$(NUnitPath)"
    WorkingDirectory="%(TestAssemblies.RootDir)%(TestAssemblies.Directory)"
    OutputXmlFile="@(TestAssemblies->'%(FullPath).$(NUnitFile)')"
    Condition="'@(TestAssemblies)' != ''"
    ExcludeCategory="$(ExcludeNUnitCategories)"
    ContinueOnError="true">
  <Output TaskParameter="ExitCode" ItemName="NUnitExitCodes"/>
</NUnit>

<Error Text="Test error(s) occured" Code="%(NUnitExitCodes.Identity)" Condition=" '%(NUnitExitCodes.Identity)' != '0' And '@(TestAssemblies)' != ''"/>

Это запустит все модульные тесты независимо от сбоя, но завершится ошибкой после того, как все они были запущены, если были какие-либо сбои. Примечание ContinueOnError="true" гарантирует, что все они запущены, и ошибка в конце проверяет, не завершился ли какой-либо из них (в nunit 0 это означает успех, все остальное - сбой).

Примечание: здесь используется задача MSBuildCommunityTasks NUnit, но если вы просто используете exec с nunit exe, вы можете получить тот же эффект. Вывод «ExitCode» является общим для любой Задачи, наследуемой от ToolTask.

person Mike    schedule 29.06.2009
comment
Привет, Майк, спасибо, что нашел время ответить. Насколько я знаю, ExitCode - это настраиваемое свойство задачи NUnit, которое не реализовано в задаче xUnit. (Задача NUnit также принимает несколько сборок (xUnit этого не делает, поэтому этот параметр называется Assembly, и по этому поводу обсуждается обсуждение кода xUnit)). Теперь, когда я прочитал заметку, я вижу, что мне нужно провести больше исследований. Удаляю этот комментарий и заменю его чем-то более разумным, когда я это сделаю (я думал, что ExitCode есть только в NUnit и Exec). Хорошая работа, у меня уже есть книга MSPress! - person Ruben Bartelink; 29.06.2009
comment
Ах, очень хороший момент, задача xunit не является производной от ToolTask, поэтому создается проблема на сайте codeplex, запросив его. Когда это будет сделано, мне просто нужно будет сделать несколько чистых вещей MSBuild, чтобы перебрать список сборки и объединить XML. - person Ruben Bartelink; 30.06.2009
comment
+1 - У меня была аналогичная проблема, и, хотя этот ответ не решил ее напрямую, он привел меня в правильном направлении - person Adam Ralph; 01.04.2011