tfs msbuild mbunit team-build

tfs - ¿Cómo obtengo Team Build para ejecutar las pruebas de MbUnit?



msbuild team-build (3)

Tengo problemas para que Team Build ejecute las pruebas de mi unidad MbUnit. Intenté editar TFSBuild.proj y agregué las siguientes partes:

<Project ...> <UsingTask TaskName="MbUnit.MSBuild.Tasks.MbUnit" AssemblyFile="path_to_MbUnit.MSBuild.Tasks.dll" /> ... ... <ItemGroup> <TestAssemblies Include="$(OutDir)/Project1.dll" /> <TestAssemblies Include="$(OutDir)/Project2.dll" /> </ItemGroup> <Target Name="Tests"> <MbUnit Assemblies="@(TestAssemblies)" ReportTypes="html" ReportFileNameFormat="buildreport{0}{1}" ReportOutputDirectory="." /> </Target> ... </Project>

Pero todavía tengo que hacer las pruebas para correr.


La manera en que funcionan los Grupos de elementos en el trabajo de MSBuild es que se evalúan desde el inicio de los scripts de MSBuild, antes de que se ejecute cualquier objetivo. Por lo tanto, si los ensamblajes aún no existen (lo cual no sucederá porque aún no se han construido), los Grupos de elementos no encontrarán ningún archivo.

El patrón habitual en MSBuild para evitar esto es volver a llamar a MSBuild nuevamente en este punto, de modo que cuando los grupos de elementos se evalúen en la ejecución interna de MSBuild, los ensamblados existirán.

Por ejemplo, algo como:

<PropertyGroup> <TestDependsOn> $(TestDependsOn); CallMbUnitTests; </TestDependsOn> </PropertyGroup> <Target Name="CallMbUnitTests"> <MSBuild Projects="$(MSBuildProjectFile)" Properties="BuildAgentName=$(BuildAgentName);BuildAgentUri=$(BuildAgentUri);BuildDefinitionName=$(BuildDefinitionName);BuildDefinitionUri=$(BuildDefinitionUri); BuildDirectory=$(BuildDirectory);BuildNumber=$(BuildNumber);CompilationStatus=$(CompilationStatus);CompilationSuccess=$(CompilationSuccess); ConfigurationFolderUri=$(ConfigurationFolderUri);DropLocation=$(DropLocation); FullLabelName=$(FullLabelName);LastChangedBy=$(LastChangedBy);LastChangedOn=$(LastChangedOn);LogLocation=$(LogLocation); MachineName=$(MachineName);MaxProcesses=$(MaxProcesses);Port=$(Port);Quality=$(Quality);Reason=$(Reason);RequestedBy=$(RequestedBy);RequestedFor=$(RequestedFor); SourceGetVersion=$(SourceGetVersion);StartTime=$(StartTime);Status=$(Status);TeamProject=$(TeamProject);TestStatus=$(TestStatus); TestSuccess=$(TestSuccess);WorkspaceName=$(WorkspaceName);WorkspaceOwner=$(WorkspaceOwner); SolutionRoot=$(SolutionRoot);BinariesRoot=$(BinariesRoot);TestResultsRoot=$(TestResultsRoot)" Targets="RunMbUnitTests"/> </Target> <ItemGroup> <TestAssemblies Include="$(OutDir)/Project1.dll" /> <TestAssemblies Include="$(OutDir)/Project2.dll" /> </ItemGroup> <Target Name="RunMbUnitTests"> <MbUnit Assemblies="@(TestAssemblies)" ReportTypes="html" ReportFileNameFormat="buildreport{0}{1}" ReportOutputDirectory="." /> </Target>

Espero que ayude, buena suerte.

Martín.


La sugerencia anterior no me ayudó mucho, pero encontré documentación para Team Build y ajusté mi script de compilación para anular el objetivo AfterCompile:

(EDIT: ahora que tengo una mejor comprensión de Team Build, he agregado algo más al runner de prueba. Ahora actualizará el Build Explorer / Build monitor con los pasos de compilación con detalles sobre la ejecución de la prueba)

<Project ...> <UsingTask TaskName="MbUnit.MSBuild.Tasks.MbUnit" AssemblyFile="path_to_MbUnit.MSBuild.Tasks.dll" /> ... ... <Target Name="AfterCompile"> <ItemGroup> <TestAssemblies Include="$(OutDir)/Project1.dll" /> <TestAssemblies Include="$(OutDir)/Project2.dll" /> </ItemGroup> <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Message="Running tests (cross your fingers)..."> <Output TaskParameter="Id" PropertyName="StepId" /> </BuildStep> <MbUnit Assemblies="@(TestAssemblies)" ReportTypes="html" ReportFileNameFormat="buildreport{0}{1}" ReportOutputDirectory="." /> <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(StepId)" Message="Yay! All tests succeded!" Status="Succeeded" /> <OnError ExecuteTargets="MarkBuildStepAsFailed" /> </Target> <Target Name="MarkBuildStepAsFailed"> <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(StepId)" Message="Oh no! Some tests have failed. See test report in drop folder for details." Status="Failed" /> </Target> ... </Project>


No es necesario que vuelva a llamar a MSBuild para que su ItemGroup se complete, hay una manera más fácil. Volver a llamar a MSBuild tiene sus desventajas, como pasar todos los parámetros de Teambuild para hacer que las tareas TeamBuild funcionen. Usamos la tarea CreateItem de MSBuild para generar dinámicamente un ItemGroup con todas nuestras DLL de prueba:

<Target Name="AfterCompile"> <CreateItem Include="$(OutDir)/*.Test.dll"> <Output TaskParameter="Include" ItemName="TestBinaries"/> </CreateItem> </Target><!--Test run happens in a later target in our case, we use MSTest -->