2009-08-21 6 views

Respuesta

12

El elemento Target tiene un atributo OnError que puede establecer en un destino para ejecutar en caso de error, pero como solo se ejecuta si el destino tiene un error, solo resuelve la mitad del escenario.

¿Ha considerado encadenar objetivos juntos para representar los "pasos" de prueba que desea ejecutar?

<PropertyGroup> 
    <TestSteps>TestInitialization;Test;TestCleanup</TestSteps> 
</PropertyGroup> 

El objetivo 'TestInitialization' es donde se puede realizar cualquier inicialización de prueba, el objetivo de 'Prueba' ejecuta la prueba, el objetivo 'TestCleanup' hace ningún tipo de ensayo posterior a limpiar.

A continuación, ejecutar estos objetivos mediante el tarea CallTarget, utilizando el atributoRunEachTargetSeparately establecido en verdadera. Esto ejecutará todos los objetivos, independientemente de su éxito o error.

La muestra completa es a continuación:

<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> 
+0

Acabo de probar esto ahora, y funciona perfectamente. Gracias por el ejemplo bastante completo. – ripper234

+0

np! Me alegro de que funcionó! –

+1

Buena respuesta, aunque sería bueno saber cómo "volver a lanzar", para continuar con la analogía try/finally. La limpieza puede necesitar ejecutarse sin importar qué, pero la compilación aún falla. –

0

O utilice <OnError> para llamar a su objetivo en el caso de error, y DependsOnTargets o CallTarget para llamar a su mismo objetivo en el caso normal.

Cuestiones relacionadas