Wie erhalte ich Team Build MbUnit Tests laufen?
-
03-07-2019 - |
Frage
Ich habe Probleme bekommen Team Build meine MbUnit Unit-Tests durchzuführen. Ich habe versucht, TFSBuild.proj und hinzugefügt, um die folgenden Teile zu bearbeiten:
<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>
Aber ich habe noch die Tests zu bekommen auszuführen.
Lösung
Vor Vorschlag half mir nicht viel, aber ich fand eine Dokumentation zu Team beim Aufbau und angepasst meinen Build-Skript des AfterCompile Ziel außer Kraft zu setzen:
(EDIT: Nun, da ich ein besseres Verständnis des Teams haben beim Aufbau habe ich einige mehr auf die Probe Läufer hinzugefügt Es wird nun die Build-Explorer / Build-Monitor mit eingebautem Schritte mit Details über den Testlauf aktualisieren.)
<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>
Andere Tipps
Sie brauchen nicht MSBuild zu rufen wieder Ihre ItemGroup bevölkert zu haben, gibt es einen einfacheren Weg. Re-Aufruf MSBuild seine Schattenseiten hat, wie vorbei all Teambuild-Parameter auf Teambuild-Aufgaben Arbeit zu machen. Wir verwenden die CreateItem Aufgabe von MSBuild dynamisch eine ItemGroup mit all unserem Test-DLLs zu erzeugen:
<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 -->
Die Art und Weise ItemGroups in MSBuild Arbeit ist, dass sie ganz am Anfang der MSBuild Scripts ausgewertet werden, bevor irgendwelche Ziele liefen werden. Deshalb, wenn die Baugruppen noch nicht vorhanden ist (was sie nicht, weil sie noch nicht gebaut), dann die ItemGroups keine Dateien finden.
Die in MSBuild üblichen Muster, dies zu umgehen ist MSBuild wieder ruft wieder an dieser Stelle, so dass, wenn die Artikelgruppen in der Innen MSBuild Ausführung ausgewertet zu bekommen, werden die Baugruppen vorhanden sein.
Zum Beispiel so etwas wie:
<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>
Ich hoffe, das, viel Glück hilft.
Martin.