Comment obtenir Team Build pour exécuter les tests MbUnit?
-
03-07-2019 - |
Question
Je ne parviens pas à faire utiliser Team Build pour exécuter mes tests unitaires MbUnit. J'ai essayé de modifier TFSBuild.proj et ajouté les parties suivantes:
<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 n'ai pas encore réussi à faire exécuter les tests.
La solution
La suggestion ci-dessus ne m'a pas beaucoup aidée, mais j'ai trouvé de la documentation pour Team Build et ajusté mon script de construction pour remplacer la cible AfterCompile:
(EDIT: maintenant que j'ai une meilleure compréhension de Team Build, j'ai ajouté quelques éléments supplémentaires au lanceur de tests. Il mettra à jour le moniteur Build Explorer / Build avec des étapes de construction avec des détails sur le 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>
Autres conseils
Il n'est pas nécessaire de rappeler MSBuild pour que votre groupe d'éléments soit rempli. Il existe un moyen plus simple. Réappeler 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 de manière dynamique un groupe d’éléments 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 -->
La façon dont ItemGroups fonctionne dans MSBuild est qu’ils sont évalués au tout début des scripts MSBuild, avant que les cibles ne soient exécutées. Par conséquent, si les assemblys n’existent pas encore (ce qu’ils ne feront pas car ils n’ont pas encore été construits), les groupes d’éléments ne trouveront aucun fichier.
Le modèle habituel dans MSBuild pour contourner ce problème consiste à rappeler le fichier MSBuild à nouveau afin que, lorsque les groupes d'éléments sont évalués dans l'exécution MSBuild interne, les assemblys existent.
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>
Espérons que cela vous aidera, bonne chance.
Martin.