2014-10-10 73 views
1

我的應用程序有幾個單元測試項目。所有其他項目和單元測試項目都構建到一個公共輸出目錄。使用msbuild任務,我收集所有單元測試程序集並運行vstest.console.exe來測試這些程序集。vstest.console拋出System.IO.FileNotFoundException

"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.dlls並使用Test Runner執行這些定義。

回答

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> 
+0

在我們的場景中,我們有兩個類庫項目,我們姑且稱之爲A和B.兩者都有自己的單元測試。 A將通過我們自己的NuGet存儲庫編譯爲A.dll和B引用A.dll。我們通過TFS 2015爲我們的存儲庫中的所有單元測試程序集運行vstest作爲構建步驟。因此,B期望NuGet提供的修訂版本,而不是由A構建的修訂版本,這會導致System.IO.FileLoadException。禁用部署可修復此衝突,但會導致新問題:我們使用DeploymentItem屬性進行了一些單元測試。部署禁用時不會部署這些文件。 – HeBu 2016-08-10 13:33:34

+0

拯救了我的生命! – 2016-12-06 16:17:22

相關問題