2012-03-14 71 views
11

我想知道在MSTest下的測試類中初始化實例變量的最佳做法是什麼。假設我有一個測試課,其中有很多開銷來嘲弄和設置支持對象。我只想做一次,而不是在每個測試中重複相同的代碼。我的想法是使用MyClassInitialize方法初始化所有測試可以訪問的全局實例變量。這樣,我一次初始化全局實例變量,並在每次測試運行時使用它們。MSTest,MyClassInitialize和實例變量

不幸的是,MyClassInitialize方法是靜態的,所以不能初始化全局實例變量。我想過讓全局實例變量是靜態的,但似乎並不是正確的解決方案。我接下來想到的只是將初始化代碼放入測試類本身的構造函數中,但我內心卻一直在說MyClassInitialize就是我應該使用的。另一個想法是使用MyTestInitialize,因爲該方法不是靜態的,但是這將在每次測試中反覆創建對象。這是否合適?

是否存在如何在測試中使用變量的最佳實踐,其中這些變量只需要在測試運行之前初始化一次?以下是我正在談論的一個人爲的例子。

[TestClass()] 
public class ProgramTest 
{ 
    // this object requires extensive setup so would like to just do it once 
    private SomeObjectThatIsUsedByAllTestsAndNeedsInitialization myObject; 
    private TestContext testContextInstance; 

    [ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     // initializing SomeObjectThatIsUsedByAllTestsAndNeedsInitialization clearly will 
     // not work here because this method is static. 
    } 

    [TestMethod()] 
    public void Test1() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test2() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test3() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 
} 

回答

8

儘可能地使用[TestInitialize]和[TestCleanup]。單元測試應該是快速和獨立的,所以最簡潔的方法是對每個測試進行初始化和清理。這可確保測試結果不受其他測試的影響。當一個測試的初始化需要很長時間時,你可能沒有考慮單元測試,而是一個集成測試。

例外是集成測試轉到數據庫或其他資源,可能需要執行一次操作,然後使用多個斷言(TestMethods)驗證結果。我曾經有一個具有上下文類型的特定泛型類,每個類只能初始化一次。但是現在我認爲這是矯枉過正的,只是把依賴關係和結果放在私有靜態變量中。

1

您可以在其他一些類中使用實例變量的延遲初始化。不要忘記,儘管MSTest會爲其運行的每個測試方法創建一個新的測試類實例。因此,您希望在測試方法中保留的那個類中的任何變量最好是靜態的。

3

你有什麼問題與靜態?

如果你的ObjectThatIsUsedByAllTests真的可以在你的所有測試之間真正被100%共享,那麼使它成爲靜態的並且使用ClassInitialize--就是這樣。

如果不是,那麼您必須對每個測試初始化​​TestInitialize。

+1

無法真正量化我的靜態問題。它只是不「感覺」正確,但我無法解釋爲什麼。 – meyousikmann 2012-03-15 11:57:38

+0

靜態意味着它由班級擁有。非靜態的東西由類的實例擁有。當試圖確定一件事是否應該是靜態的時,問問自己'這是整個班級擁有還是隻是一個實例? – Tristan 2014-10-03 04:16:30