如何获得Team Build来运行MbUnit测试?
时间:2020-03-06 14:56:24 来源:igfitidea点击:
我无法让Team Build执行我的MbUnit单元测试。我尝试编辑TFSBuild.proj并添加了以下部分:
<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>
但是我还没有运行测试。
解决方案
MSBuild中ItemGroups的工作方式是在运行任何目标之前,在MSBuild脚本的开始对它们进行评估。因此,如果程序集尚不存在(由于尚未构建而不会存在),则ItemGroups将找不到任何文件。
要解决此问题,MSBuild中的常用模式是此时再次调用MSBuild,以便在内部MSBuild执行中评估项目组时,程序集将存在。
例如,类似:
<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>
希望对我们有帮助,祝我们好运。
马丁
上面的建议对我没有太大帮助,但是我找到了一些有关Team Build的文档,并调整了我的构建脚本以覆盖AfterCompile目标:
(编辑:现在,我对团队建设有了更好的了解,我在测试运行器中添加了更多内容。它现在将使用带有有关测试运行细节的构建步骤来更新"构建资源管理器/构建"监视器。)
<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>
我们无需再次调用MSBuild即可填充ItemGroup,这是一种更简单的方法。回顾MSBuild有其缺点,例如传递所有Teambuild参数以使TeamBuild任务正常工作。我们使用来自MSBuild的CreateItem任务来动态生成带有所有测试DLL的ItemGroup:
<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 -->