Um ein verteiltes Test-Szenario umzusetzen, muss man evtl. mit mehreren Testlauf-Konfigurationen (Abb. Solution mit mehreren testrunconfig-Dateien) arbeiten und diese in einem Build ausführen. Der Standard-Buildprozess kann nur die in der .vsmdi-Datei aktivierte Testrunconfig verwenden. Dies ist für Tests auf mehreren VSTT-Controllern (Visual Studio Team System Load Test Controller) aber nicht ausreichend. Wir haben daher den Buildtypen angepasst, um auch dieses Szeanrio zu unterstützen.
Voraussetzung für die folgenden Beschreibungen sind vorhandene Unit-Tests, die der Testliste “Calc Tests” zugeordnet wurden. Die Metadaten im Buildtype müssen wie folgt angepasst werden:
<MetaDataFile Include=“$(BuildProjectFolderPath)/../../TFS Support/Smoke Tests/WindowsFormsApplication/WindowsFormsApplication.vsmdi“> <TestList>Calc Tests</TestList> <TestRunConfig>$(SolutionRoot)\Local.testrunconfig</TestRunConfig> </MetaDataFile> <MetaDataFile Include=“$(BuildProjectFolderPath)/../../TFS Support/Smoke Tests/WindowsFormsApplication/WindowsFormsApplication.vsmdi“> <TestList>Calc Tests</TestList> <TestRunConfig>$(SolutionRoot)\RemoteXP.testrunconfig</TestRunConfig> </MetaDataFile> <MetaDataFile Include=“$(BuildProjectFolderPath)/../../TFS Support/Smoke Tests/WindowsFormsApplication/WindowsFormsApplication.vsmdi“> <TestList>Calc Tests</TestList> <TestRunConfig>$(SolutionRoot)\RemoteVista.testrunconfig</TestRunConfig>
</MetaDataFile>
Dies ordnet den Metadaten entsprechende testrunconfig-Dateien zu, unter deren Verwendung die Tests später ausgeführt werden sollen. Das Team-Foundation-Build-Target (Version 2008!) „CoreTestConfiguration“ muss wie folgt überschrieben werden (im lokalen Buildtype):
<Target Name=“CoreTestConfiguration“
DependsOnTargets=“$(CoreTestConfigurationDependsOn)“
Outputs=“@(TestOutputs)“>
<Warning Condition=“ ‘$(V8TestToolsTask)’==’true’ and ‘$(TestNames)’!=” “
Text=“Warning: The TestNames property cannot be used in in combination with the V8 TestToolsTask and will be ignored.“ />
<Warning Condition=“ ‘$(V8TestToolsTask)’==’true’ and ‘@(LocalTestContainer)’ != ” “
Text=“Warning: The TestContainer item group cannot be used in combination with the V8 TestToolsTask and will be ignored.“ />
<Message Text=“Info: V8TestToolsTask = $(V8TestToolsTask)“ />
<Message Text=“Info: LocalMetaDataFile %(LocalMetaDataFile.Identity), %(LocalMetaDataFile.TestList), %(LocalMetaDataFile.TestRunConfig)“ />
<Message Text=“Info: MetaDataFile %(MetaDataFile.Identity), %(MetaDataFile.TestList), %(MetaDataFile.TestRunConfig)“ />
<!– MetaDataFile tests for non-desktop builds. –>
<TestToolsTask
Condition=“ ‘$(IsDesktopBuild)’!=’true’ and ‘$(V8TestToolsTask)’!=’true’ and ‘%(LocalMetaDataFile.Identity)’ != ” “
BuildFlavor=“$(Configuration)“
Platform=“$(Platform)“
PublishServer=“$(TeamFoundationServerUrl)“
PublishBuild=“$(BuildNumber)“
SearchPathRoot=“$(OutDir)“
PathToResultsFilesRoot=“$(TestResultsRoot)“
MetaDataFile=“%(LocalMetaDataFile.Identity)“
RunConfigFile=“%(LocalMetaDataFile.TestRunConfig)“
TestLists=“%(LocalMetaDataFile.TestList)“
TeamProject=“$(TeamProject)“
TestNames=“$(TestNames)“
ContinueOnError=“true“ />
<!– 8.0 MetaDataFile tests for non-desktop builds. –>
<TestToolsTask
Condition=“ ‘$(IsDesktopBuild)’!=’true’ and ‘$(V8TestToolsTask)’==’true’ and ‘%(LocalMetaDataFile.Identity)’ != ” “
BuildFlavor=“$(Configuration)“
Platform=“$(Platform)“
PublishServer=“$(TeamFoundationServerUrl)“
PublishBuild=“$(BuildNumber)“
SearchPathRoot=“$(OutDir)“
PathToResultsFilesRoot=“$(TestResultsRoot)“
MetaDataFile=“%(LocalMetaDataFile.Identity)“
RunConfigFile=“%(LocalMetaDataFile.TestRunConfig)“
TestLists=“%(LocalMetaDataFile.TestList)“
TeamProject=“$(TeamProject)“
ContinueOnError=“true“ />
<!– TestContainer tests for non-desktop builds. –>
<TestToolsTask
Condition=“ ‘$(IsDesktopBuild)’!=’true’ and ‘$(V8TestToolsTask)’!=’true’ and ‘@(LocalTestContainer)’ != ” “
BuildFlavor=“$(Configuration)“
Platform=“$(Platform)“
PublishServer=“$(TeamFoundationServerUrl)“
PublishBuild=“$(BuildNumber)“
SearchPathRoot=“$(OutDir)“
PathToResultsFilesRoot=“$(TestResultsRoot)“
RunConfigFile=“$(RunConfigFile)“
TestContainers=“@(LocalTestContainer)“
TeamProject=“$(TeamProject)“
TestNames=“$(TestNames)“
ContinueOnError=“true“ />
<!– MetaDataFile tests for desktop builds. –>
<TestToolsTask
Condition=“ ‘$(IsDesktopBuild)’==’true’ and ‘$(V8TestToolsTask)’!=’true’ and ‘%(MetaDataFile.Identity)’ != ” “
SearchPathRoot=“$(OutDir)“
PathToResultsFilesRoot=“$(TestResultsRoot)“
MetaDataFile=“%(MetaDataFile.Identity)“
RunConfigFile=“%(MetaDataFile.TestRunConfig)“
TestLists=“%(MetaDataFile.TestList)“
TestNames=“$(TestNames)“
ContinueOnError=“true“ />
<!– 8.0 MetaDataFile tests for desktop builds. –>
<TestToolsTask
Condition=“ ‘$(IsDesktopBuild)’==’true’ and ‘$(V8TestToolsTask)’==’true’ and ‘%(MetaDataFile.Identity)’ != ” “
SearchPathRoot=“$(OutDir)“
PathToResultsFilesRoot=“$(TestResultsRoot)“
MetaDataFile=“%(MetaDataFile.Identity)“
RunConfigFile=“%(MetaDataFile.TestRunConfig)“
TestLists=“%(MetaDataFile.TestList)“
ContinueOnError=“true“ />
<!– TestContainer tests for desktop builds. –>
<TestToolsTask
Condition=“ ‘$(IsDesktopBuild)’==’true’ and ‘$(V8TestToolsTask)’!=’true’ and ‘@(LocalTestContainer)’ != ” “
SearchPathRoot=“$(OutDir)“
PathToResultsFilesRoot=“$(TestResultsRoot)“
RunConfigFile=“$(RunConfigFile)“
TestContainers=“@(LocalTestContainer)“
TestNames=“$(TestNames)“
ContinueOnError=“true“ />
<!– Populate TestOutputs with MetaData Files and Test Containers. –>
<ItemGroup>
<!– TestContainer tests for non-desktop and desktop builds. –>
<TestOutputs Condition=“ ‘@(LocalTestContainer)’ != ” “
Include=“%(LocalTestContainer.Identity)“>
<Platform>$(Platform)</Platform>
<Configuration>$(Configuration)</Configuration>
</TestOutputs>
<!– MetaDataFile tests for non-desktop builds. –>
<TestOutputs Condition=“ ‘$(IsDesktopBuild)’!=’true’ and ‘%(LocalMetaDataFile.Identity)’ != ” “
Include=“%(LocalMetaDataFile.Identity)“>
<Platform>$(Platform)</Platform>
<Configuration>$(Configuration)</Configuration>
</TestOutputs>
<!– MetaDataFile tests for desktop builds. –>
<TestOutputs Condition=“ ‘$(IsDesktopBuild)’==’true’ and ‘%(MetaDataFile.Identity)’ != ” “
Include=“%(MetaDataFile.Identity)“>
<Platform>$(Platform)</Platform>
<Configuration>$(Configuration)</Configuration>
</TestOutputs>
</ItemGroup>
</Target>
Das überschriebene Target ist dabei generisch und kann auch mit einer testrunconfig-Datei verwendet werden. Hat man diese Änderungen im Buildtypen vorgenommen, kann man den ersten Build anstoßen. Das Ergebnis sind mehrere Testläufe im Build, die je nach testrunconfig-Einstellungen z.B. auf unterschiedlichen VSTT-Controllern laufen (Abb. Testergebnisse im Build-Bericht).