2009-07-12 58 views
2

Nunit在CruiseControl.NET中運行得很好,但有一件事情讓我非常惱火。 如果存在導致Nunit崩潰的測試,我只會收到有關崩潰的信息,因爲Nunit的XML報告沒有機會創建併合併到CruiseControl報告中。如何在CruiseControl.NET服務器上的NUnit測試崩潰時報告進度?

即使Nunit在執行過程中崩潰,我也需要一種方式來報告進度。

我已經試圖強制每個測試輸出一些信息到控制檯來解決這個問題。我曾考慮過使用SetUp方法,但我還沒有找到任何好方法來獲取當前運行測試的名稱。

回答

0

如果獲取當前正在運行的測試的名稱是你在做什麼,你可以用下面的抓住它後:

using System.Diagnostics; 

... 

[Test] 
public void SomeTestThatWillCrash() 
{ 
    StackFrame sf = new StackFrame(); 
    Console.WriteLine("Now running method: " + sf.GetMethod().Name); 
    ... 

} 
+1

此方法使用起來很繁瑣,因爲必須修改每個測試以包含這些行。 – user95319 2009-07-13 22:46:13

0

CruiseControl.net建議您使用NUnit通過你的建設者(即惡性/ MSBuild的)。見這裏:http://confluence.public.thoughtworks.org/display/CCNET/NUnit+Task。正如他們所描述的那樣 - 它將允許您首先在本地運行這些測試 - 這會給您一個例外,您可以清除。

這就是說 - 您的開發人員是否在簽入代碼之前運行這些單元測試?這可以緩解這個問題。如果它的集成問題 - 我會建議抓住最新的代碼庫,並在本地運行測試,看看有什麼不同。

我不知道NUnit是否能夠創建結果文件,即使它崩潰。即使這樣做 - 如果由於崩潰導致文件格式不正確,您可能會遇到問題。

+0

事實上,即使任務崩潰也沒有意義,所以創建一個XML報告是不合理的,因爲這會導致xml報告不完整。我們需要的是將進度寫入控制檯,這也將記錄在CruiseControl日誌中,以便我們可以輕鬆識別碰撞測試。 – user95319 2009-07-13 22:50:00

+1

要在本地運行測試將是這個問題的一個很好的解決方案,但它不適合我們的需求。我們使用的測試非常複雜,需要超過20分鐘才能運行。更糟的是有時候這個問題只會在服務器上顯示出來,這使得調試變得更加困難。 – user95319 2009-07-15 02:10:29

0

您可以使用@ jpoh的方法,但在TestSetup方法中執行該方法,這將需要您按照每個燈具進行操作。如果確實需要的話,你可以編寫一個基類,所有你的測試裝置從實現這個方法的繼承。

另一種解決方案是使用MSBuild運行NUnit並使用MSBuildCommunityTasks庫中的任務。這允許你繼續出錯,並從NUnit獲取錯誤代碼。你不會得到什麼方法導致問題,但可能會幫助一些。這是我的MSBuild目標:

<Target Name="UnitTest" 
      DependsOnTargets="BuildIt"> 

    <NUnit Assemblies="@(TestAssemblies)" 
       ToolPath="$(NUnitx86Path)" 
       WorkingDirectory="%(TestAssemblies.RootDir)%(TestAssemblies.Directory)" 
       OutputXmlFile="@(TestAssemblies->'%(FullPath).$(NUnitFile)')" 
       Condition="'@(TestAssemblies)' != ''" 
       ExcludeCategory="$(ExcludeNUnitCategories)" 
       ContinueOnError="true"> 
     <Output TaskParameter="ExitCode" ItemName="NUnitExitCodes"/> 
    </NUnit> 

    <!-- Copy the test results for the CCNet build before a possible build failure (see next step) --> 
    <CallTarget Targets="CopyTestResults" Condition="'@(TestAssemblies)' != ''"/> 
    <Error Text="Test error(s) occured" Code="%(NUnitExitCodes.Identity)" Condition=" '%(NUnitExitCodes.Identity)' != '0' And '@(TestAssemblies)' != ''"/> 

    </Target> 

這可能不會滿足您的需要,但是可以嘗試和玩。

這就是說,我會同意@rifferte,這聽起來像你需要在本地調試問題,而不是依靠CC.NET來處理報告。

1

我認爲一個更好的答案是創建一個NUnit加載項,該插件實現EventListener接口來捕獲TestStarted事件以將進度輸出到控制檯或文件。

EventListener接口被記錄在NUnit的網站:http://nunit.org/index.php?p=eventListeners&r=2.5

另外,我們可以使儀表板報告甚至更好時,NUnit的執行過程中崩潰。我們可以使用以下程序來確保DashBoard始終顯示有關測試的信息。

  1. 有輸出的進展到一個單獨的文件
  2. 運行測試後,將事件監聽運行測試,使用另一個程序來檢查文件
  3. 如果該文件不包含特定的「端線」,生成基於該文件的特殊XML報告並將其合併到CruiseControl日誌中
相關問題