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.testrunconfig 文件,内容如下(下)
使用 /runconfig 运行 mstest,没有隔离,但没有执行任何操作:
MSTest.exe /runconfig:d:\local.testrunconfig /testcontainer:d:\MyTestTests.dll /test:MyTest
结果: 正在加载 d:\local.testrunconfig... d:\local.testrunconfig d:\local.testrunconfig
...什么也没有发生:没有错误,没有执行任何测试!
编辑/解决: 默认情况下,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.testrunconfig 在下面
<?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,你让我用你的 tesrunconfig 学到了新东西。
【讨论】:
以上是关于MSTest 和 app.config 问题的主要内容,如果未能解决你的问题,请参考以下文章
app.configs 和 MSTest 项目 - 连接字符串的空引用