【问题标题】:How do I get Team Build to run MbUnit tests?如何让 Team Build 运行 MbUnit 测试?
【发布时间】:2010-09-14 08:11:44
【问题描述】:

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

但我还没有运行测试。

【问题讨论】:

    标签: tfs msbuild mbunit tfsbuild


    【解决方案1】:

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

    (编辑:现在我对 Team 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>
    

    【讨论】:

      【解决方案2】:

      您无需再次调用 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 -->
      

      【讨论】:

        【解决方案3】:

        MSBuild 中 ItemGroup 的工作方式是在 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>
        

        希望有帮助,祝你好运。

        马丁。

        【讨论】:

          猜你喜欢
          • 2011-01-14
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-03
          • 2017-05-24
          • 1970-01-01
          相关资源
          最近更新 更多