Como faço para obter Criar equipe para executar testes MbUnit?
-
03-07-2019 - |
Pergunta
Estou tendo problemas para obter o Team Build para executar meus testes de unidade MbUnit. Tentei editar TFSBuild.proj e acrescentou as seguintes partes:
<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>
Mas eu ainda tenho que obter os testes a serem executados.
Solução
Acima sugestão não me ajudar muito, mas eu encontrei alguma documentação para a equipe Construir e ajustei meu script de construção para substituir o alvo AfterCompile:
(EDIT: Agora que tenho uma melhor compreensão do Team Build, eu adicionei um pouco mais para o corredor de teste Ele agora irá atualizar o / monitor de Configuração CONFIGURAÇÃO Explorer com etapas de construção com detalhes sobre a execução do teste.)
<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>
Outras dicas
Você não precisa chamar MSBuild novamente para ter seu ItemGroup povoada, há uma maneira mais fácil. Re-chamando MSBuild tem as suas desvantagens, como passar todos os TeamBuild-parâmetros a fazer TeamBuild-tarefas de trabalho. Nós usamos a tarefa CreateItem do MSBuild para gerar dinamicamente uma ItemGroup com todo o nosso teste de DLLs:
<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 -->
A forma ItemGroups no trabalho MSBuild é que eles são avaliados no início dos scripts de MSBuild, antes de quaisquer alvos são ran. Portanto, se as assembléias não existem ainda (o que eles não vão, porque eles ainda não foram construídos), então os ItemGroups não vai encontrar nenhum arquivo.
O padrão usual em MSBuild Para contornar este é re-call MSBUILD novamente neste ponto de modo que quando os grupos de itens obter avaliados na execução MSBuild interior, as assembleias existirá.
Por exemplo, algo como:
<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>
Espero que ajude, boa sorte.
Martin.