vstest.console抛出System.IO.FileNotFoundException

问题描述:

我的应用程序有几个单元测试项目。所有其他项目和单元测试项目都构建到一个公共输出目录。使用msbuild任务,我收集所有单元测试程序集并运行vstest.console.exe来测试这些程序集。vstest.console抛出System.IO.FileNotFoundException

"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正在将测试程序集和依赖程序集复制到“testresults”目录中的“out”目录。然而,并非所有需要的程序集都是由项目引用的,而是手动复制到公共输出目录。这些程序集在“testresults”的“out”目录中缺少并导致System.IO.FileNotFoundException。

使用MSTest,我可以通过添加DeploymentItem来使用指向公共输出目录的配置文件。对于vstest.console,这不起作用了。

如何解决此问题?我不想使用“out”目录。从公共输出目录运行我的单元测试就好了。

PS。我在TFS 2013上有构建定义的问题。我的构建定义正在收集* .unittest.dlls并使用Test Runner执行这些定义。

该解决方案使用.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> 
+0

在我们的场景中,我们有两个类库项目,我们姑且称之为A和B.两者都有自己的单元测试。 A将通过我们自己的NuGet存储库编译为A.dll和B引用A.dll。我们通过TFS 2015为我们的存储库中的所有单元测试程序集运行vstest作为构建步骤。因此,B期望NuGet提供的修订版本,而不是由A构建的修订版本,这会导致System.IO.FileLoadException。禁用部署可修复此冲突,但会导致新问题:我们使用DeploymentItem属性进行了一些单元测试。部署禁用时不会部署这些文件。 – HeBu 2016-08-10 13:33:34

+0

拯救了我的生命! – 2016-12-06 16:17:22