【问题标题】:vstest.console throws System.IO.FileNotFoundExceptionvstest.console 抛出 System.IO.FileNotFoundException
【发布时间】:2014-12-05 14:15:51
【问题描述】:

我的应用程序有几个单元测试项目。所有其他项目和单元测试项目都构建到一个公共输出目录中。通过一个 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 会将测试程序集和依赖的程序集复制到“testresults”目录中的“out”目录中。但是,并非所有需要的程序集都被项目引用,而是手动复制到公共输出目录。这些程序集在“testresults”的“out”目录中丢失并导致 System.IO.FileNotFoundException。

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

我能做些什么来避免这种行为?我不想使用“out”目录。从公共输出目录运行我的单元测试就可以了。

PS。我在 TFS 2013 上遇到了与构建定义相同的问题。我的构建定义正在收集 *.unittest.dll 并使用 Test Runner 执行这些。

【问题讨论】:

    标签: unit-testing vstest


    【解决方案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>
    

    【讨论】:

    • 在我们的场景中,我们有两个类库项目,我们称它们为 A 和 B。它们都有自己的单元测试。 A 将编译为 A.dll,B 通过我们自己的 NuGet 存储库引用 A.dll。我们正在通过 TFS 2015 为我们存储库中的所有单元测试程序集运行 vstest 作为构建步骤。因此,B 期望 NuGet 提供的版本,而不是 A 构建的版本。这会导致 System.IO.FileLoadException。禁用部署可以解决此冲突,但会导致新问题:我们使用 DeploymentItem 属性进行了一些单元测试。禁用部署时不会部署文件。
    猜你喜欢
    • 2013-02-08
    • 2022-01-18
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2020-05-22
    相关资源
    最近更新 更多