Элемент Target имеет атрибут OnError , который можно установить для цели, которая будет выполняться при ошибке, но поскольку он выполняется только в случае ошибки цели, он решает только половину сценария.
Рассматривали ли вы связывание целей вместе, чтобы представить «шаги» теста, которые вы хотите выполнить?
<PropertyGroup>
<TestSteps>TestInitialization;Test;TestCleanup</TestSteps>
</PropertyGroup>
Цель «TestInitialization» - это место, где вы можете выполнить любую инициализацию теста, цель «Test» выполняет тест, цель «TestCleanup» выполняет любую очистку после теста.
Затем выполните эти цели, используя задачу CallTarget , используя атрибут RunEachTargetSeparately , установленный в True . Это выполнит все цели, независимо от успеха или неудачи.
Полный образец ниже:
<Project DefaultTargets = "TestRun"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<!-- Insert additional tests between TestInitialization and TestCleanup as necessary -->
<PropertyGroup>
<TestSteps>TestInitialization;Test;TestCleanup</TestSteps>
</PropertyGroup>
<Target Name = "TestRun">
<CallTarget Targets="$(TestSteps)" RunEachTargetSeparately="True" />
</Target>
<Target Name = "TestInitialization">
<Message Text="Executing Setup..."/>
</Target>
<Target Name = "Test">
<Message Text="Executing Test..."/>
<!-- this will fail (or should unless you meet the conditions below on your machine) -->
<Copy
SourceFiles="test.xml"
DestinationFolder="c:\output"/>
</Target>
<Target Name = "TestCleanup">
<Message Text="Executing Cleanup..."/>
</Target>
</Project>