NUnit控制台“无法加载文件或程序集”使用MySolution.sln

6

我要使用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。我执行了文件 > 打开项目 > 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   
---------------------------

这里可以找到异常信息

发生了什么,如何修复?(而不必维护一个 MySolution.nunit 文件)

更多信息

  • MyNamespace.Administration 甚至不是包含测试的 dll 之一,这意味着 nunit 失败并试图加载它以查找要运行的测试。因此,我编辑了 nunit-x86.exe 创建的文件(MySolution.nunit),删除了所有没有测试的 dll。果然,测试正常工作(在 gui 和 console 中)。但这对我来说是不可接受的,因为这意味着我必须保持另一个配置文件。Nunit 支持 .sln 文件本来应该避免这种情况。
  • 我的测试使用 TestDriven.Net 运行良好(但我真的需要使用 nunit-console 运行它们)
  • 我看过这个答案,但我无法看出融合日志查看器所说的内容。发布此日志是否有帮助?程序集绑定日志查看器列表中创建了 3 个文件:
    • nunit-agent-x86.exe,这似乎正在尝试在 nunit 目录中查找MyNamespace.Administration.dll/EXE
    • 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”放置吗? - andreister
它被一个测试项目(dll)引用,但当我使用MySolution.nunit时,该项目可以正常工作,这让我相信它实际上是在尝试加载该项目以查看是否有测试而导致失败(我假设它打开项目以查看哪些项目有测试)。 - João Portela
将该项目明确添加到.nunit中,看看是否会失败,这个怎么样?通常对于非测试项目,NUnit只会报告它没有测试。 - andreister
确定 .NET 版本没问题吗?你不会把 .NET4 的程序集放到旧版的 NUnit 中运行吧?或许试试进行一次干净的构建。然后尝试移除 Administration.dll 的依赖项,再逐个添加并查看是否有所不同。 - andreister
我会尝试移除依赖项。我已经尝试过传递 /framework=4.5/framework=net-4.5,但没有成功。还有 'NUnit-Console 版本 2.6.2.12296'。 - João Portela
让我们在聊天中继续这个讨论。点击此处进入聊天室 - João Portela
2个回答

5

以下是我的回复,转载自nunit-discuss:

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

正如你所建议的那样,我认为特定的程序集加载失败是因为其具有一个向上的依赖关系。当加载VS解决方案文件或NUnit项目文件时,NUnit将应用程序基础设置为包含解决方案或项目的目录。这就是为什么一个向上的NUnit项目文件可以工作的原因。

设计者在这种情况下的意图是您将创建一个NUnit项目文件。我认识到这有些不方便,因为它会给您另一个需要维护的配置文件。我对在命令行或项目文件中使用通配符的建议持开放态度。任何此类更改可能会进入下一个主要升级版本,即NUnit 3.0。


个人认为,增加一个额外的命令参数来指示在每个项目根目录中运行测试会很不错。对于有数十个项目的解决方案,使用.sln文件非常方便,但仍应该有一些方法来保证配置文件和依赖项的隔离。 - MytyMyky

3
很遗憾,即使在nunit-discuss group上发布后,我仍然无法找到解决这个问题的合适方法。
nunit-discuss小组确认我的测试失败是因为存在一个向上依赖关系。
但是,我找到了一个可接受的解决方法。
由于直接调用.dll没有同样的问题。 我可以使用通配符来做到这一点,但我在使用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'

这个项目结构更短且更宽松。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接