MSTest 和 app.config 问题

Posted

技术标签:

【中文标题】MSTest 和 app.config 问题【英文标题】:MSTest and app.config issue 【发布时间】:2011-06-16 06:07:56 【问题描述】:

我一直在尝试使用 MSTest 和 app.config 部署来自动化单元测试运行。我阅读了多篇文章和博客,尝试了多种方法,但在 MSTest 执行期间似乎仍然没有获取 app.config。拥有一个包含我使用 msbuild 构建的所有单元测试的 dll,这就是我尝试过的...

尝试 1

    使用 MyTests.dll 将 app.config 复制到与 MyTests.dll.config 相同的位置(在某个 msdn 论坛上,据说会自动获取) 为每个测试添加了[DeploymentItem("MyTests.dll.config")] 属性 跑MSTest.exe /noisolation /testcontainer:d:\MyTestTests.dll /test:MyTest

尝试 2

    创建了 local.testrunco​​nfig 文件,内容如下(下) 使用 /runco​​nfig 运行 mstest,没有隔离,但没有执行任何操作:MSTest.exe /runconfig:d:\local.testrunconfig /testcontainer:d:\MyTestTests.dll /test:MyTest

结果: 正在加载 d:\local.testrunco​​nfig... d:\local.testrunco​​nfig d:\local.testrunco​​nfig

...什么也没有发生:没有错误,没有执行任何测试!


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


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

【问题讨论】:

map.ExeConfigFilename = @"配置文件路径"; 【参考方案1】:

卡特罗,

我的设置如下所示(我正在使用来自 TFSbuild.proj 的 msbuild):

    构建 sln

    将所有内容从输出复制到 %TEMP%(黑魔法:D) 不知道为什么,但是 mstest 正在 %TEMP% 中寻找参考。

    使用参数运行 mstest:

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

【讨论】:

感谢您分享您的配置,Marius。我没有安装 TFS,因此您的 cmd 行中的大多数设置(/publish、/platform、/flavor 等)将不适用于我的环境。我在没有 TFS 设置的情况下尝试了您的配置和 cmd 行,我得到了与尝试 2 相同的行为 - 未执行测试。【参考方案2】:

您的应用程序不使用 app.config。它使用应用程序.exe.config。这就是您需要部署的内容。


抱歉,没有看到您正在测试 DLL。

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

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

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

【讨论】:

我将 app.config 重命名为 MyTests.dll.config 并使 deploymentItem 指向 MyTests.dll.config。结果相同 “我通常在 Visual Studio 中使用单元测试项目,所以我只是从该项目中部署配置文件。” 开箱即用,谢谢。【参考方案3】:

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

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

感谢大家的回答!支票交给你了,Marius,你让我用你的 tesrunco​​nfig 学到了新东西。

【讨论】:

以上是关于MSTest 和 app.config 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个构建配置选择不同的 app.config

app.configs 和 MSTest 项目 - 连接字符串的空引用

App.Config 和 Web.Config 的区别?

web.config 和 app.config 混淆

app.config 中的 maxReceivedMessageSize 和 maxBufferSize

NUnit 和 app.config 的问题