Tfs 如何让Team Build运行MbUnit测试?

Tfs 如何让Team Build运行MbUnit测试?,tfs,msbuild,mbunit,tfsbuild,Tfs,Msbuild,Mbunit,Tfsbuild,我很难让团队构建来执行我的MbUnit单元测试。我已尝试编辑TFSBuild.proj并添加了以下部分: <Project ...> <UsingTask TaskName="MbUnit.MSBuild.Tasks.MbUnit" AssemblyFile="path_to_MbUnit.MSBuild.Tasks.dll" /> ... ... <ItemGroup> <TestAssemblies Include="$(Ou

我很难让团队构建来执行我的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中的项组的工作方式是,在运行任何目标之前,在MSBuild脚本的一开始就对它们进行评估。因此,如果程序集还不存在(因为它们还没有生成,所以它们不会存在),那么项目组将找不到任何文件

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>

$(TestDependsOn);
CallMbUnitTests;
希望有帮助,祝你好运


Martin。

上述建议对我帮助不大,但我找到了一些团队构建文档,并调整了构建脚本以覆盖AfterCompile目标:

(编辑:现在我对Team Build有了更好的理解,我在测试运行程序中添加了更多内容。它现在将使用包含测试运行详细信息的构建步骤更新构建资源管理器/构建监视器)


...
...
...

您不需要再次调用MSBuild来填充项目组,有一种更简单的方法。重新调用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 -->

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