如何让Team Build运行MbUnit测试?

时间:2008-09-30 18:47:31

标签: tfs msbuild mbunit team-build

我无法让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>

但我还没有让测试运行。

3 个答案:

答案 0 :(得分:1)

上面的建议对我没什么帮助,但我找到了Team Build的一些文档,并调整了我的构建脚本以覆盖AfterCompile目标:

(编辑:现在我对Team Build有了更深入的了解,我已经向测试运行器添加了更多内容。现在它将使用构建步骤更新Build Explorer / Build监视器,其中包含有关测试运行的详细信息)

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

答案 1 :(得分:1)

您不需要再次调用MSBuild来填充您的ItemGroup,这是一种更简单的方法。重新调用MSBuild有其缺点,例如传递所有Teambuild参数以使TeamBuild-tasks工作。我们使用MSBuild中的CreateItem任务动态生成包含所有Test 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 -->

答案 2 :(得分:0)

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>

希望有所帮助,祝你好运。

马丁。