MSTest and app.config issue

21,532

Solution 1

Kateroh,

My setup looks like this (I'm using msbuild from a TFSbuild.proj):

  1. Build sln

  2. Copy all from output to %TEMP% (black magic :D) Don't know why but mstest is looking for references in %TEMP%.

  3. Run mstest with parms:

"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe" /nologo /testcontainer:$(TestDir)\mylib.dll /resultsfile:$(TestResultFile) /runconfig:$(SlnDir)\AutomaticBuildTest.testrunconfig /searchpathroot:$(TestDir) /publish:mytfsserver /publishbuild:$(BuildDefinition) /flavor:Debug /platform:AnyCPU /teamproject:mytfsproject

where AutomaticBuildTest.testrunconfig is bellow


<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="AutomaticBuildTest" id="eda99352-93e1-402e-9517-d04fffa66b35" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
    <!--<Deployment enabled="false" />-->
    <Deployment enabled="true">
        <DeploymentItem filename="D:\sa12\78\bin\Debug" />
    </Deployment>
    <NamingScheme baseName="BC2ALibraryTest" appendTimeStamp="false" useDefault="false" />
    <!-- http://blogs.msdn.com/b/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx -->
    <Execution location="Local" hostProcessPlatform="MSIL">
        <!--http://msdn.microsoft.com/en-us/library/ms404663.aspx-->
        <ExecutionThread apartmentState="MTA" />
        <Hosts skipUnhostableTests="false" />
        <TestTypeSpecific>
            <UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
                <AssemblyResolution applicationBaseDirectory="D:\sa12\78\bin\Debug">
                    <TestDirectory useLoadContext="false" />
                </AssemblyResolution>
            </UnitTestRunConfig>
        </TestTypeSpecific>
        <AgentRule name="LocalMachineDefaultRole">
        </AgentRule>
    </Execution>
</TestSettings>


Solution 2

Your application doesn't use app.config. It uses application.exe.config. That's what you need to deploy.


Sorry, didn't see you were testing a DLL.

This is not how .NET configuration works. Each DLL does not use its own config file. It can only use the config file of the .exe it is running in (actually, of the AppDomain it's running in).

You would somehow need to get MSTEST to add your .dll.config to its own configuration, assuming it's actually the host process. I don't see how to do that from the command line.

I usually use a Unit Test Project in Visual Studio, so I just deploy the config file from that project. Works fine.

Solution 3

The problem is, as it turns out, with our over-complicated build environment and the fact that we are using and x-copiable version of MSTest (produced locally). The following command succeeded when I ran against VS2008 "proper" MSTest:

"%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\MSTest.exe" /testcontainer:d:\MyTests.dll /test:MyTests /resultsfile:results.trx

Thanks everyone for the answers! The check goes to you, Marius, you made me learn new things with your tesrunconfig.

Share:
21,532
kateroh
Author by

kateroh

Updated on May 03, 2020

Comments

  • kateroh
    kateroh about 4 years

    I am stuck trying to automate unit tests runs with MSTest and deployment of app.config. I read multiple posts and blogs, tried multiple things and yet still app.config doesn't seem to be picked up during MSTest execution. Having a dll that contains all my unit tests built with msbuild, here is what I've tried...

    Attempt 1

    1. Copied app.config to the same location with MyTests.dll as MyTests.dll.config (on one of the msdn forums it was said it'd be picked up automagically)
    2. Added [DeploymentItem("MyTests.dll.config")] attribute to each test
    3. Ran MSTest.exe /noisolation /testcontainer:d:\MyTestTests.dll /test:MyTest

    Attempt 2

    1. Created local.testrunconfig file with the following content (below)
    2. Ran mstest with /runconfig and no isolation, but nothing was executed: MSTest.exe /runconfig:d:\local.testrunconfig /testcontainer:d:\MyTestTests.dll /test:MyTest

    Result: Loading d:\local.testrunconfig...
    d:\local.testrunconfig
    d:\local.testrunconfig

    ... and nothing happens: no errors, no tests are executed!


    EDIT/RESOLUTION: By default, MSTest executes tests in separate processes. In this case, config file is automatically picked up if it is named like "dllname.dll.config". However, it is hard to debug tests running in separate processes if they run outside of VS. /noisolation switch is used to make MSTest run all tests in one process. However, in this case test config file is NOT picked up. Instead, MSTest.exe.config file is used, which is located in the same directory as MSTest. To resolve this issue, configuration file can be loaded pragmatically like this:

    
    ExeConfigurationFileMap map = new ExeConfigurationFileMap();
    map.ExeConfigFilename = @"path to config file";
    Configuration config = 
       ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
    
  • kateroh
    kateroh over 13 years
    I renamed app.config to MyTests.dll.config and made the deploymentItem point to MyTests.dll.config. Same result
  • kateroh
    kateroh over 13 years
    thanks for sharing your config, Marius. I dont have TFS installed, so most of the settings in your cmd line (/publish, /platform, /flavor, etc) will not apply to my environment. I tried your config and cmd line without TFS settings and I get the same behavior as in my attempt 2 - not tests are executed.
  • Lasse Christiansen
    Lasse Christiansen almost 10 years
    "I usually use a Unit Test Project in Visual Studio, so I just deploy the config file from that project." Works out of the box, thanks.