2017-06-07 65 views
0
Windows 10 
Visual Studio 2017 
TeamCity 2017.1.2 
GitHub 

我正在使用VS解決方案,該解決方案在本地表現如預期。主項目有一些程序包依賴性。測試項目對主項目有項目引用。 VS本地編譯成功。主項目參考+相關性被複制到MyProject/bin/debug;測試項目引用+依賴項被複制到MyProject.Tests/bin/debug; ReSharper本地運行測試成功。TeamCity:NUnit無法找到目標程序集的依賴關係

但是我的TC項目在運行測試時遇到問題。

我積累的配置步驟是:從GitHub拉,運行Visual Studio (sln) build,觸發NUnit.ConsoleRunner運行測試VS內置組件 - 這將引發未找到錯誤(無法找到包的依賴組件)的文件,或許表明構建步驟需要保存爲相關程序集的工件並將其複製到測試輸出目錄。

但是看在代理工作目錄我發現同時出現在主項目和測試項目的依賴組件:

C:\TeamCity\buildAgent\work\64f706c42d79250c\{main-project}\bin\Debug\{dependency}.dll 

C:\TeamCity\buildAgent\work\64f706c42d79250c\{tests-project}\bin\Debug\{dependency}.dll 

這表明VS生成步驟按照預期將{dependency}.dll複製到bin中。

那麼爲什麼不能NUnit找到它?

[19:27:48][Step 5/5] MyProject.dll 
[19:27:48][MyProject.dll] MyProject.UnitTests.MyTest 
[19:27:49][MyProject.UnitTests.MyTest] System.IO.FileNotFoundException : Could not load file or assembly 'MyProjectDependency, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. 
[19:27:49] 
[MyProject.UnitTests.MyTest] at ReferencingCode() 
    at MyProject.MyClass.Answer() in C:\TeamCity\buildAgent\work\64f706c42d79250c\MyProject\MyClass.cs:line 9 
    at MyProject.UnitTests.MyTest() in C:\TeamCity\buildAgent\work\64f706c42d79250c\MyProject\UnitTests.cs:line 10 
[19:27:51][Step 5/5] Failed tests detected 

我想知道如果輸出迪爾斯都爲VS BuildNUnit步驟不同?但是我的代理工作目錄與我的本地VS解決方案目錄相同 - 那麼TC將在哪裏找到NUnit工作目錄?

+0

我不知道我明白你有什麼問題以及你在做什麼。單元測試不使用程序集。他們使用源代碼。這是白盒測試。即單元測試直接與您的代碼一起工作。 –

+0

本地我的測試項目有一個項目引用到我的主項目; VS解決方案構建將主項目程序集及其依賴項程序集複製到測試項目的「debug/bin」文件夾中,然後「ReSharper」對這些程序集運行測試。 – BaltoStar

回答

0

看起來好像您有兩個完全獨立的輸出目錄,一個在測試項目下,一個在主項目下。當然,您的測試運行在包含測試程序集的目錄中。

輸出消息似乎表示主程序集正在複製到測試程序集目錄中 - 測試項目的引用必須調用本地副本。我們可以知道,因爲測試程序集和主程序集都在棧跟蹤中有條目。但是,依賴程序集可能不會被您的測試引用,因此不會被複制。至少我是這麼讀的 - 通過查看目錄內容來驗證。

您可以通過對所有內容使用相同的輸出目錄來解決此問題,但這可能會涉及更改您正在使用的目錄結構。一個簡單的解決方法是將對依賴程序集的引用添加到測試項目中,並將本地複製設置爲true。

+0

檢查代理工作目錄顯示與本地VS相同的文件夾結構後編譯:main + test子文件夾,每個都有'/ debug/bin',並且依賴程序集*存在於測試程序集bin中,所以顯然VS構建步驟是在那裏複製它。你是否在說TC正在創建一些其他的輸出目錄,專門用於運行測試?但是這個位於代理的位置?我不喜歡在我的測試項目中添加copy-local引用依賴項,因爲它不需要桌面VS編譯/運行測試 - 僅爲了TC而添加ref會導致編寫代碼的人感到困惑 - -線。 – BaltoStar

+0

檢查TeamCity生成的'.nunit'文件。這將顯示事情在執行時的位置。或者只是運行一個顯示其組裝位置的測試。 – Charlie

0

爲了讓您的測試在本地或在TeamCity中運行,您的測試項目必須對您正在測試的項目具有項目引用。它不能以其他方式工作。它還會怎樣知道要測試什麼?因此,請在測試項目中檢查您的引用,並確保構建以「Debug」和「Release」形式運行時輸出是相同的。

在一個側面說明,讓TC做實際的構建和測試對於簡單的東西來說很好,但它很難排除故障。我建議你用PSake構建一個PowerShell腳本並創建一個「測試」任務。這樣,您可以在本地運行腳本,TeamCity可以使用您在本地運行的相同腳本。

+0

當在本地使用解決方案時,所有工作均按預期進行。我的測試項目有一個主要項目的參考。 VS本地編譯成功;主項目引用+依賴項被複制到'MyProject/bin/debug';測試項目引用+依賴項被複制到'MyProject.Tests/bin/debug';本地測試運行成功。一切如預期。我的問題出現在構建代理上:令人困惑的是代理工作目錄與我的本地解決方案看起來完全相同dir - 「MyProject.Tests/bin/debug」包含要測試的程序集及其依賴關係。所以爲什麼'NUnit.Console'找不到? – BaltoStar

+0

我沒有足夠的信息來確定NUnit爲什麼找不到您的參考。您可以複製構建命令並從代理上的命令行運行它,並查看您獲得的內容。這就是爲什麼我建議創建一個腳本在本地使用。 –

相關問題