MSTest和app.config问题

时间:2011-01-27 00:29:02

标签: c# msbuild app-config mstest

我很难尝试使用MSTest和app.config的部署来自动运行单元测试。我阅读了多个帖子和博客,尝试了多项内容,但在MSTest执行期间,似乎仍然没有选择app.config。有一个包含我用msbuild构建的所有单元测试的dll,这是我尝试过的......

尝试1

  1. 将app.config复制到MyTests.dll作为MyTests.dll.config的同一位置(在其中一个msdn论坛上,它被称为自动拾取)
  2. 为每个测试添加了[DeploymentItem("MyTests.dll.config")]属性
  3. MSTest.exe /noisolation /testcontainer:d:\MyTestTests.dll /test:MyTest
  4. 尝试2

    1. 使用以下内容创建local.testrunco​​nfig文件(如下)
    2. 使用/ runco​​nfig执行mstest并且没有隔离,但没有执行任何操作:MSTest.exe /runconfig:d:\local.testrunconfig /testcontainer:d:\MyTestTests.dll /test:MyTest
    3. 结果: 正在加载d:\ local.testrunco​​nfig ...
      d:\ local.testrunco​​nfig
      d:\ local.testrunco​​nfig

      ......没有任何反应:没有错误,没有执行任何测试!


      编辑/解析:默认情况下,MSTest在单独的进程中执行测试。在这种情况下,如果配置文件的名称类似于“dllname.dll.config”,则会自动获取配置文件。但是,如果在VS之外运行,则很难调试在单独进程中运行的测试。 / noisolation开关用于使MSTest在一个进程中运行所有测试。但是,在这种情况下,测试配置文件 NOT 被选中。而是使用MSTest.exe.config文件,该文件与MSTest位于同一目录中。要解决此问题,可以像这样实际加载配置文件:

      
      ExeConfigurationFileMap map = new ExeConfigurationFileMap();
      map.ExeConfigFilename = @"path to config file";
      Configuration config = 
         ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
      

3 个答案:

答案 0 :(得分:6)

Kateroh,

我的设置看起来像这样(我正在使用来自TFSbuild.proj的msbuild):

  1. 构建sln

  2. 将所有输出复制到%TEMP%(黑魔法:D) 不知道为什么,但mstest正在寻找%TEMP%的参考文献。

  3. 使用参数运行mstest:

  4. "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

    其中AutomaticBuildTest.testrunco​​nfig低于标准

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

答案 1 :(得分:5)

您的应用程序不使用app.config。它使用 application .exe.config。这就是你需要部署的东西。


抱歉,没看到你在测试DLL。

这不是.NET配置的工作原理。每个DLL都不使用自己的配置文件。它只能使用它运行的.exe的配置文件(实际上,它正在运行的AppDomain)。

你会以某种方式让MSTEST将你的.dll.config添加到它自己的配置中,假设它实际上是主机进程。我不知道如何从命令行执行此操作。

我通常在Visual Studio中使用单元测试项目,所以我只是从该项目部署配置文件。工作正常。

答案 2 :(得分:2)

事实证明,问题在于我们过于复杂的构建环境以及我们正在使用MSTest(本地生产)的x-copiable版本。当我针对VS2008“正确”MSTest运行时,以下命令成功:

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

谢谢大家的答案!检查结果告诉你,Marius,你让我用tesrunco​​nfig学习新东西。