2010-09-01 71 views
31

我們在測試套件中需要一些全球一次性設置代碼。我們可以多做一次,但需要相當長的一段時間。NUnit全局初始化 - 壞主意?

  • 它是所有燈具都需要的,所以[TestFixtureSetUp]不起作用。它必須在所有[TestFixtureSetUp]代碼之前運行。

  • 將它放在Main()中,因爲我們將測試程序集保存爲可執行文件。但是,Main不會在GUI客戶端下執行。

  • 使用靜態構造函數創建一個獨立的類用於初始化僅當您引用我們不贊成在每個類中執行的類時纔有效。

  • 從基類繼承所有測試裝置並向其添加靜態構造函數會導致對該代碼的多次調用。

現在鑑於這種情況,我有兩個問題:

1)是「全球建立」一個非常糟糕的主意,它不是由NUnit的支持?

2)什麼是最痛苦的,最常見的方式來實現這一目標?

+1

通過爲那些誰不知道的方式,MbUnit的支持「AssemblyFixture」,其固定設置代碼每個裝配運行一次班。我知道我的問題是關於NUnit的,但任何想轉換開關的人都應該考慮這一點。 – 2011-04-27 06:33:51

回答

78

[SetUpFixture]

這是標記,它包含一個給定的命名空間下的所有測試夾具的一次性設置或拆除方法的類的屬性。

SetUpFixture中的SetUp方法在包含在其名稱空間中的任何燈具之前執行一次。 TearDown方法在所有燈具完成執行後執行一次。

大會初始化。如果您不將類放在任何名稱空間中,它將應用於程序集中的所有測試。

例如。

// using statements 

[SetUpFixture] 
public class GlobalSetup { 
    [SetUp] 
    public void ShowSomeTrace() { 
    Trace.WriteLine("It works..."); // won't actually trace 
    } 
} 

http://www.nunit.org/index.php?p=setupFixture&r=2.4

+0

哦,我認爲'SetUpFixture'和'TestFixtureSetUp'是一樣的東西,一個被棄用。這就是答案,謝謝! – 2011-04-29 11:15:24

+10

它在文檔中說明了這一點,但要明確指出.....如果您沒有將此類放入命名空間,它將用於「組件範圍」設置/拆卸。 – 2011-10-04 14:43:46

+0

@GregB我已將您的評論添加到實際答案中,歡呼聲。 – ashes999 2013-01-24 20:30:07

0

1)我想這取決於上下文。我從來不需要任何項目的全局設置,但我可以想象場景,例如一個只讀取數據的應用程序,以及一個通用的全局數據設置。

2)您可以進行全局設置,例如在你提到的燈具底座中,有狀態的。即有一個HasRun屬性或執行前檢查的類似內容。

1

我不認爲有一個很好的方法可以實現它 - 可能是因爲NUnit主要用於單元測試,並且你不應該需要任何全局設置來進行單元測試(一切都應該在每個測試夾具中進行本地模擬)。

然而,使用NUnit進行集成測試非常常見,並且在這種情況下,通常會有一個全局設置。這裏有幾個合理的選項:

  1. 在我當前的項目中,我們通常在運行測試的msbuild腳本中執行此操作。好處是您在編寫新測試時不需要記住任何特殊設置。缺點 - 您必須確保在從IDE運行測試時設置了所有設置。

  2. 如果上述不是一個選項,你可以使用你的最後一個想法 - 從一個共同的基類繼承測試。然後,基類可以引用一個單例類(你可以找到Jon Skeets關於如何實現單例的文章),它將完成設置。這樣它將只運行一次。

+0

我想在默認跟蹤偵聽器上將「AssertUIEnabled」設置爲false,這樣如果斷言在代碼堆棧中的某處失敗,我就不會彈出一個彈出窗口。這是我想要做的一件事,我希望它在所有測試中都能發生。 – Marius 2011-02-09 08:03:34

+1

我正在測試一個使用ActiveRecord的MVC3應用程序,我需要初始化一次,然後運行所有測試 - 這對於一個好用例來說如何? :) – ashes999 2011-11-14 19:30:21

11

正如我的評論所述,您可以通過使用位於程序集級別的SetUpFixture來實現程序集範圍初始化。我需要這個關閉UI上的默認跟蹤偵聽:

[SetUpFixture] 
public class AssemblySetup 
{ 
    [SetUp] 
    public void Setup() 
    { 
     var traceListener = Debug.Listeners.Cast<TraceListener>().FirstOrDefault(listener => listener is DefaultTraceListener) as DefaultTraceListener; 

     if (traceListener != null) 
      traceListener.AssertUiEnabled = false; 
    } 
} 

更多關於裝配或命名空間設置:http://www.nunit.org/index.php?p=setupFixture&r=2.4

注:正如其他人所指出的,不要使用這間隔離腐敗你的測試。