2013-07-01 78 views
5

我想用nunit-console運行我的解決方案中的所有測試。nunit-console「無法加載文件或程序集」使用MySolution.sln

我這樣做:

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的控制檯來運行它們)
  • 我已經看過this answer但我不能做的融合日誌查看器說什麼意義。發佈該日誌有幫助嗎?集綁定日誌查看器,列出了創建3個文件:
    • NUnit的代理-x86.exe程序,這一次似乎是試圖找到MyNamespace.Administration.dll/EXE inside the nunit directories
    • Tests_24398275 X2 - 一個在我的項目文件夾尋找nunit.core另一個在我的項目文件夾中查找unit.core.interfaces。我會很少注意這兩個,因爲它們也出現在我手動編輯的.nunit項目中)。
  • (perreister comment)該問題似乎與項目/程序集本身,而不是創建方法。如果我創建一個.nunit項目並嘗試向其添加MyNamespace.Administration(使用'添加程序集...'或'添加VS項目...'),則失敗。
  • 調用nunit-console-x86 somepath/bin/Debug/MyNamespace.Administration.dll直接工作。
+0

顯然,'MyNamespace.Administration.dll'包含測試使用的代碼。你確定你沒有忘記,例如,在引用項目時把'CopyLocal = True'放在哪裏? – andreister

+0

它被一個測試項目(dll)引用,但該項目在我使用MySolution.nunit時起作用,這導致我相信它真的無法加載該項目只是爲了查看它是否有測試(我假設它打開項目以查看哪些項目有測試)。 –

+0

如何明確地將該項目添加到'.nunit'中,以查看它是否會失敗?通常對於非測試項目,NUnit只報告它沒有測試。 – andreister

回答

3

不幸的是,即使在發佈nunit-discuss group之後,我仍無法找到適合此問題的解決方案。

nunit-discuss group證實我的測試失敗了,因爲它有一個級別的依賴關係。

但我找到了可以接受的解決辦法。

由於直接調用.dll s沒有相同的問題。 我可以用globs做這個,但是我在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。 此外,如果我只提供正確的文件,速度會更快。

如果你有慶典的一個較新版本(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' 

哪個更短,更寬容的項目結構。

5

轉貼我的答覆NUnit的-討論:

裝載VS解決方案的NUnit的功能實在是相當有限的,並打算用簡單的項目或作爲一個快速的方法來創建一個NUnit的項目文件中工作 - 即加載解決方案並保存爲NUnit項目,然後編輯創建的xml文件。由於解決方案文件格式並未指示哪些文件是測試,NUnit會嘗試加載每個項目以檢查它是否包含任何測試。 (這與Visual Studio 2012和更高版本在使用測試瀏覽器窗口時的做法是一樣的)。

正如你所建議的,我認爲特定的程序集由於具有上一級的依賴性而無法加載。在加載VS解決方案文件或NUnit項目文件時,NUnit將應用程序庫設置爲包含解決方案或項目的目錄。這就是爲什麼一個級別的NUnit項目文件起作用。

設計師在這種情況下的意圖是你會創建一個NUnit項目文件。我認識到這有點不方便,因爲它給你另一個配置文件來維護。我接受關於在命令行或項目文件中使用globs的建議。任何此類更改都可能進入下一個主要升級NUnit 3.0。

+0

Personaly,一個額外的命令參數,可以表明測試應該在每個項目的根目錄下運行會很好。對於有幾十個項目的解決方案,使用.sln文件非常方便,但仍應該有一些方法來保證配置文件和依賴項隔離。 – MytyMyky

相關問題