2012-07-06 120 views
8

我有一個使用SpecFlow,NUnit和Coypu在Web應用程序上進行驗收測試的項目。我已經通過Jenkins在構建服務器上構建了OK項目。 Jenkins調用一個在規格項目上運行msbuild的psake腳本,然後腳本調用nunit-console運行規格/測試,然後我想從SpecFlow生成一個報告。嘗試生成測試執行報告時specflow失敗

Framework "4.0" 

task Default -depends RunSpecs 

task BuildSpecs { 
    $env:EnableNuGetPackageRestore = "true" 
    msbuild /t:Rebuild ReturnsPortal.Specs.csproj 
} 

task RunSpecs -depends BuildSpecs { 
    exec { & "C:\path\to\NUnit 2.5.9\bin\net-2.0\nunit-console-x86.exe" /labels /out=TestResult.txt /xml=TestResult.xml .\bin\Debug\TheWebApp.Specs.dll } 
    exec { & "C:\path\to\SpecFlow\1.8.1\specflow.exe" nunitexecutionreport TheWebApp.Specs.csproj /out:SpecResult.html } 
} 

那對specflow.exe最後exec調用失敗,雖然與:

元素< ParameterGroup>元素< UsingTask之下>是無法識別的。 C:\ Program Files文件(x86)的\詹金斯\ \工作TheWebApp \工作區\網絡\網站\ TheWebApp.nuget \ nuget.targets

正在使用谷歌搜索暗示,也許是與MSBuild的版本有問題的位(例如,herehere)。但我在我的psake腳本中有Framework "4.0",Specs項目的目標是.NET Framework 4.0,並且在構建步驟中構建得很好,所以我不確定爲什麼specflow似乎使用的是早期版本的msbuild。或者也許是其他地方的問題?

+0

你嘗試傳遞msbuild的完整路徑嗎? ('C:\ WINDOWS \微軟。NET \ Framework64 \ v4.0.30319 \ MSBuild.exe') – KMoraz 2012-07-08 09:29:55

+0

謝謝,這將是問題,但我不知道如何強制SpecFlow使用特定版本的msbuild。 – ngm 2012-07-11 10:40:56

回答

29

這是我的答案,從SpecFlow Wiki

重要的是.NET 4.0的項目:由於specflow.exe編譯爲.NET 3.5,它不能被默認加載.NET 4.0程序集。要爲.NET 4.0項目生成此報告,必須強制specflow.exe使用配置文件來使用.NET 4.0運行時。只需複製下面的配置並創建一個specflow.exe.config文件,並將其放在您的specflow.exe旁邊,您就可以創建步驟定義報告。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0.30319" /> 
    </startup> 
</configuration> 
+0

SpecFlow 2.0於2016年1月27日發佈,針對.NET 4.5編譯。新版本中不應出現此問題。 – ngm 2016-02-12 14:18:56

2

我試圖使用配置文件解決方案,以上建議。它適用於本地測試,但只要我將代碼推送到我們的CI環境,就會因爲CI環境沒有該配置文件而窒息。我們限制CI環境只使用各種軟件包的乾淨版本,所以我們不想嘗試將特殊配置注入到CI服務器中。

我們注意到SpecFlow在我們的幾個.NET 4.0項目中工作得很好,沒有特殊的配置文件。經過一番研究,實際的「問題」似乎是NuGet 2.1。 NuGet 1.7的.NET 4.0項目一切正常。

1.7到2.1之間的某處NuGet在NuGet.targets文件中引入了舊版本的MSBuild不支持的新功能。具體來說,該問題似乎是在<UsingTask>元素下的<ParameterGroup>,正如錯誤消息所解釋的那樣。

粗略瀏覽目標文件表明該部分負責保持NuGet處於最新狀態。刪除這一節完全可以解決這個問題,就像添加上面的配置文件一樣,雖然也刪除了似乎提供的自我更新功能。鑑於.targets文件已提交到存儲庫,此解決方案也可在我們的CI環境中工作,而無需在CI端進行任何更改。

這不一定是比ngm更好的解決方案,它只是一個不同的解決方案。取決於你的環境,這可能是一個可取的方法,或者可能不是。

+2

理想情況下,SpecFlow將提供一個爲.NET 4.0編譯的軟件包,這應該可以解決所有這些問題,但看起來他們目前對此沒有興趣。 – Mir 2013-01-10 22:29:01

相關問題