Question

Je ne parviens pas à faire utiliser Team Build pour exécuter mes tests unitaires MbUnit. J'ai essayé de modifier TFSBuild.proj et ajouté les parties suivantes:

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

Mais je n'ai pas encore réussi à faire exécuter les tests.

Était-ce utile?

La solution

La suggestion ci-dessus ne m'a pas beaucoup aidée, mais j'ai trouvé de la documentation pour Team Build et ajusté mon script de construction pour remplacer la cible AfterCompile:

(EDIT: maintenant que j'ai une meilleure compréhension de Team Build, j'ai ajouté quelques éléments supplémentaires au lanceur de tests. Il mettra à jour le moniteur Build Explorer / Build avec des étapes de construction avec des détails sur le test).

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

Autres conseils

Il n'est pas nécessaire de rappeler MSBuild pour que votre groupe d'éléments soit rempli. Il existe un moyen plus simple. Réappeler MSBuild a ses inconvénients, comme passer tous les paramètres Teambuild pour que les tâches TeamBuild fonctionnent. Nous utilisons la tâche CreateItem de MSBuild pour générer de manière dynamique un groupe d’éléments avec toutes nos DLL de test:

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

La façon dont ItemGroups fonctionne dans MSBuild est qu’ils sont évalués au tout début des scripts MSBuild, avant que les cibles ne soient exécutées. Par conséquent, si les assemblys n’existent pas encore (ce qu’ils ne feront pas car ils n’ont pas encore été construits), les groupes d’éléments ne trouveront aucun fichier.

Le modèle habituel dans MSBuild pour contourner ce problème consiste à rappeler le fichier MSBuild à nouveau afin que, lorsque les groupes d'éléments sont évalués dans l'exécution MSBuild interne, les assemblys existent.

Par exemple, quelque chose comme:

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

Espérons que cela vous aidera, bonne chance.

Martin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top