views:

480

answers:

1

Hello guys, I would like to ask what is the best way to execute a setup like the following: We have tests suite that is compiled, and in the app.config file I have 6-7 different connection strings to different databases. I would like to run the tests suite against every connection, and I hoped to parametrize in some way this process - something like setting the name of the connection and passing it on to the testrun as a parameter. What I figured out so far is that I can use different localconfigrun files and through deployment items I can feed a xml/txt file with the required value, but is there a nicer and lighter solution? I need just to send a key/value pair or simple string to configure my base class inside the test suite.

I am using tfsbuild but I can use the mstest thrugh other environments as well (pure msbuild, etc.)

Thanks in advance.

+1  A: 

I have had a similar issue. This is what I did:

My app.config looks like this:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="ConenctToInputDB" value="InputDev" />
    <add key="ConnectToOutputDB" value ="OutputDev"/>
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  <connectionStrings>
    <add name="LocalConnection" connectionString="YOUR CONNECTION STRING HERE" />
    <add name="InputDev" connectionString="YOUR CONNECTION STRING HERE" />
    <add name="InputCert" connectionString="YOUR CONNECTION STRING HERE"/>
    <add name="OutputDev" connectionString="YOUR CONNECTION STRING HERE/>
    <add name="OutputCert" connectionString="YOUR CONNECTION STRING HERE" />
    <add name="InputProd" connectionString="YOUR CONNECTION STRING HERE/>
    <add name="OutputProd" connectionString="YOUR CONNECTION STRING HERE" />
  </connectionStrings>

In this secenario, I have 2 dbs I connect to and I have 3 different connection strings for each (Development, Certification and Production)

Add this to the bottom of your project file (right click on the project and unload it). Make sure you add it before the </project> tag. (You will need to install the MSBuild Community Tasks for this to work. They can be downloaded for free from: http://msbuildtasks.tigris.org/ (Make sure you get a nightly build))

  <PropertyGroup>
    <!--Import the MSBuild community tasks so we can update xml-->
    <MSBuildCommunityTasksPath>C:\PathToMSBuildCommunityTasks\MSBuildTasks</MSBuildCommunityTasksPath>
    <SubstitutionsFile Condition="'$(Configuration)' == 'Debug'">DevAppSettings.xml</SubstitutionsFile>
    <SubstitutionsFile Condition="'$(Configuration)' == 'Cert'">CertAppSettings.xml</SubstitutionsFile>
    <SubstitutionsFile Condition="'$(Configuration)' == 'Prod'">ProdAppSettings.xml</SubstitutionsFile>
  </PropertyGroup>
  <Import Project="C:\PathToMSBuildCommunityTasks\lib\MSBuildTasks\MSBuild.Community.Tasks.Targets" />
  <Target Name="AfterBuild">
    <!--Update the app config to have the correct environment paths-->
    <Message Text="Updating $(MSBuildProjectName) config to $(Configuration)" Importance="high"></Message>
    <XmlMassUpdate ContentFile="$(OutDir)\$(MSBuildProjectName).dll.config" SubstitutionsFile="..\..\$(SubstitutionsFile)" />
  </Target>

This will replace the <appSettings> section of the app.config file based on the current configuration. You will need to make new new configurations (I called them Cert and Prod).

The last step is to make a file for each configuration (I called them DevAppConfig.xml, CertAppConfig.xml, ProdAppConfig.xml)

In each file should look like this (this one is for the Certification Configuration):

<?xml version="1.0" encoding="utf-8"?>
<!--This file is used by the build files to merge in solution wide app settings
Some projects contain files that have an AppSetting section (usually in App.config).  Those projects have
and AfterBuild event in the project file that substitues this xml tree over the the normal xml tree.-->
<configuration xmlns:xmu="urn:msbuildcommunitytasks-xmlmassupdate">
  <appSettings>
    <add xmu:key="key" key="ConenctToInputDB" value="Cert"/>
    <add xmu:key="key" key="ConnectToOutputDB" value="ESPCert"/>
  </appSettings>
</configuration>

all of this, once installed will make the file that is output by app.config be auto changed based on the configuration you are compiling. This code works for both compiling in the IDE and in Team Build.

Vaccano
Yes, this is a possible solution. What we did is to prepare a .localrunconfig for every database, and then in the tfsbuild to just execute all the configs one after another. Thanks for the proposed solution!
And in the base test class, we just grab the config file, and use it to instantiate the correct database.