我的应用程序有几个单元测试项目。所有其他项目和单元测试项目都构建到一个公共输出目录。使用msbuild任务我收集所有单元测试程序集并运行vstest.console.exe来测试这些程序集。
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\..\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" "Assembly1.UnitTest.dll" "Assembly2.UnitTest.dll" /Platform:x64 /Framework:Framework40 /InIsolation /Logger:trx
这会导致异常:System.IO.FileNotFoundException:无法加载文件或程序集“someassembly.dll”'或其中一个依赖项。找不到指定的模块。
当我为单个单元测试程序集执行vstest.console.exe时,上述异常不会发生。进一步的调查了解到,当同时测试多个组件时,vstest.console正在复制测试组件并将组件依赖于" out" " testresults"中的目录目录。但是,并非所有需要的程序集都由项目引用,而是手动复制到公共输出目录。这些组件在" out"目录在" testresults"并导致System.IO.FileNotFoundException。
使用MSTest,我可以通过添加DeploymentItem将配置文件指向公共输出目录。对于vstest.console,这不再适用了。
我可以做些什么来解决这种行为?我不想和" out"目录。从公共输出目录运行我的单元测试就好了。
PS。我在TFS 2013上遇到了与构建定义相同的问题。我的构建定义是收集* .unittest.dlls并使用Test Runner执行这些。
答案 0 :(得分:1)
解决方案是使用.runsettings文件。在runsettings文件中,可以指定“DeploymentEnabled”。默认情况下这是真的。将其更改为false不会将所有程序集复制到TestResults目录的out目录。有关runsettings文件的更多信息:http://msdn.microsoft.com/en-us/library/jj635153.aspx。
示例:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<!--Info: http://msdn.microsoft.com/en-us/library/jj635153.aspx -->
<MSTest>
<IgnoreTestImpact>True</IgnoreTestImpact>
<MapInconclusiveToFailed>True</MapInconclusiveToFailed>
<CaptureTraceOutput>False</CaptureTraceOutput>
<DeleteDeploymentDirectoryAfterTestRunIsComplete>True</DeleteDeploymentDirectoryAfterTestRunIsComplete>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>