2008-09-30 5 views
0

J'ai de la difficulté à faire en sorte que Team Build exécute mes tests unitaires MbUnit. J'ai essayé de modifier TFSBuild.proj et ajouté les pièces suivantes:Comment puis-je faire en sorte que Team Build exécute des tests MbUnit?

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

Mais je dois encore faire les tests à exécuter.

Répondre

1

suggestion ci-dessus ne m'a pas aidé beaucoup, mais je l'ai trouvé un peu de documentation pour l'équipe Créer et ajusté mon script de construction pour remplacer la cible AfterCompile:

(EDIT: Maintenant que j'ai une meilleure compréhension de l'équipe construire, j'ai ajouté un peu plus au coureur de test. Il va maintenant mettre à jour l'explorateur Build/construire moniteur construire des marches avec des détails sur l'exécution du test)

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

La manière dont les ItemGroups dans MSBuild fonctionnent est qu'ils sont évalués au tout début des scripts MSBuild, avant l'exécution de toutes les cibles. Par conséquent, si les assemblages n'existent pas encore (ce qui ne sera pas le cas car ils n'ont pas encore été construits), les ItemGroups ne trouveront aucun fichier. Le motif habituel dans MSBuild pour contourner ce problème est de rappeler MSBuild à ce stade de sorte que lorsque les groupes d'éléments sont évalués dans l'exécution MSBuild interne, les assemblys existeront.

Par exemple, quelque chose comme:

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

Espoir qui aide, bonne chance.

Martin.

1

Vous n'avez pas besoin d'appeler MSBuild à nouveau avoir votre ItemGroup peuplé, il y a un moyen plus facile. Le rappel de MSBuild a ses inconvénients, comme passer tous les paramètres Teambuild pour que les tâches TeamBuild fonctionnent. Nous utilisons la tâche CreateItem de MSBuild pour générer dynamiquement un ItemGroup avec toutes nos DLL de test:

<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 --> 
Questions connexes