【问题标题】:nunit-console "could not load file or assembly" using MySolution.slnnunit-console“无法加载文件或程序集”使用 MySolution.sln
【发布时间】:2013-06-28 20:01:51
【问题描述】:

我将使用nunit-console 来运行我的解决方案中的所有测试。

我这样做了:

c:\some\path>nunit-console-x86.exe MySolution.sln
NUnit-Console version 2.6.2.12296
Copyright (C) 2002-2012 Charlie Poole.
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.
Copyright (C) 2000-2002 Philip Craig.
All Rights Reserved.

Runtime Environment -
   OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
  CLR Version: 2.0.50727.5466 ( Net 3.5 )

ProcessModel: Default    DomainUsage: Default
Execution Runtime: net-3.5
Could not load file or assembly 'MyNamespace.Administration, Version=0.0.0.1, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

所以,我决定尝试nunit-x86.exe 我做了 File > Open Project > MySolution.sln 并得到了这个:

---------------------------
NUnit
---------------------------
Test load failed!

System.IO.FileNotFoundException : Could not load file or assembly 
'MyNamespace.Administration, Version=0.0.0.1, Culture=neutral, 
PublicKeyToken=null' or one of its dependencies. The system cannot 
find the file specified.

For further information, use the Exception Details menu item.
---------------------------
OK   
---------------------------

The exception can be found here

发生了什么,我该如何解决?(无需维护 MySolution.nunit 文件)

更多信息

  • MyNamespace.Administration 甚至不是包含测试的 dll 之一,这意味着 nunit 无法尝试加载它以查找要运行的测试。知道这一点后,我编辑了nunit-x86.exe (MySolution.nunit) 创建的文件,并删除了所有没有测试的 dll。果然,测试工作(在 gui 和控制台中)。这对我来说是不可接受的,因为这意味着我必须保留另一个配置文件。 Nunit 支持 .sln 文件应该可以避免这种情况。
  • 我的测试使用 TestDriven.Net 运行良好(但我确实需要使用 nunit-console 运行它们)
  • 我查看了this answer,但我无法理解融合日志查看器所说的内容。发布该日志会有帮助吗? 程序集绑定日志查看器,列出了正在创建的 3 个文件:
    • nunit-agent-x86.exe,这个好像是在找MyNamespace.Administration.dll/EXE inside the nunit directories
    • Tests_24398275 x2 - 一个在我的项目文件夹中查找 nunit.core,另一个在我的项目文件夹中查找 unit.core.interfaces。我不会注意这两个,因为它们也出现在我手动编辑的 .nunit 项目中)。
  • (根据 andreister 的评论)问题似乎出在项目/程序集本身,而不是创建方法。如果我创建一个 .nunit 项目并尝试向其中添加 MyNamespace.Administration(使用“添加程序集...”或“添加 VS 项目...”),它会失败。
  • 直接调用nunit-console-x86 somepath/bin/Debug/MyNamespace.Administration.dll 可以。

【问题讨论】:

  • 显然,MyNamespace.Administration.dll 包含测试使用的代码。你确定你没有忘记,例如,在引用项目时输入CopyLocal=True
  • 它被一个测试项目 (dll) 引用,但是当我使用 MySolution.nunit 时该项目可以工作,这让我相信它真的无法尝试加载该项目以查看它是否有测试(我假设它会打开项目以查看哪些有测试)。
  • 如何将该项目显式添加到.nunit,看看它是否会失败?通常对于非测试项目,NUnit 只会报告它没有测试。
  • @andreister 更新了问题
  • 确定 .NET 版本没问题?您不会将 .NET4 程序集馈送到较旧的 NUnit 中吗?也许尝试一个干净的构建。并尝试从Administration.dll 中删除依赖项,然后开始一一添加,看看是否有区别。

标签: nunit nunit-console


【解决方案1】:

在 nunit-discuss 上转发我的回复:

加载 VS 解决方案的 NUnit 功能非常有限,旨在用于简单项目或作为创建 NUnit 项目文件的快速方法 - 即加载解决方案并保存为 NUnit 项目,然后编辑 xml 文件被建造。由于解决方案文件格式不指示哪些文件是测试,NUnit 尝试加载每个项目以检查它是否包含任何测试。 (这与 Visual Studio 2012 及更高版本在使用测试资源管理器窗口时所做的相同,顺便说一句。)

正如您所建议的,我认为特定程序集无法加载,因为具有上一级的依赖项。当加载 VS 解决方案文件或 NUnit 项目文件时,NUnit 将应用程序库设置为包含解决方案或项目的目录。这就是 NUnit 项目文件上一级工作的原因。

设计者在这种情况下的意图是创建一个 NUnit 项目文件。我承认这有点不方便,因为它为您提供了另一个需要维护的配置文件。我愿意接受有关在命令行或项目文件中使用 glob 的建议。任何此类更改都可能会用于下一次重大升级,即 NUnit 3.0。

【讨论】:

  • 个人而言,一个额外的命令参数可以表明测试应该在每个项目的根目录中运行会很好。对于有几十个项目的解决方案,.sln 文件的使用非常方便,但仍然应该有一些方法来保证配置文件和依赖隔离。
【解决方案2】:

不幸的是,即使在nunit-discuss group 上发帖后,我也无法找到解决此问题的适当方法。

nunit-discuss 小组确认我的测试失败是因为存在上一级的依赖关系。

不过,我确实找到了一个可以接受的解决方法。

由于直接调用.dlls 没有同样的问题。 我可以用 glob 做到这一点,但我在 Windows 上......但我安装了 git bash。

利用我有些僵化的项目结构和命名约定,我设法做到了:

"C:\Program Files (x86)\Git\bin\bash.exe" -c 'nunit-console-x86.exe //framework=net-4.5 //xml:nunitresults.xml MysolutionFolder/Tests/*/bin/Debug/*.Tests.dll'

请注意,我利用了我的命名约定。为了减少参数的数量,这样做非常重要。

当我使用nunit-console-x86 MysolutionFolder/*/*/bin/Debug/*.dll 而不是MysolutionFolder/Tests/*/bin/Debug/*.Tests.dll 时,我收到了来自nunit-console-x86 的错误消息Bad file number。 此外,如果我提供正确的文件,它会更快。

如果您有更新版本的 bash(我认为是 4.0+),您可以改用以下命令(注意使用 **):

"C:\Program Files (x86)\Git\bin\bash.exe" -c 'nunit-console-x86.exe //framework=net-4.5 //xml:nunitresults.xml MysolutionFolder/**/bin/Debug/*.Tests.dll'

这在项目结构上更短、更宽松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多