2016-04-21 76 views
3

情況:我的一些集成測試類共享通用方法來設置數據庫中的場景,因此我提供了一個抽象基類。它也負責一個完整的數據清理,在結束後所有測試跑:每個測試類多個ClassCleanup屬性

public abstract class IntegrationTests 
{ 
    ... 
    protected static void Cleanup() { ... } 
} 

我的繼承類必須調用基方法,以確保我的基地清理代碼運行:

[TestClass] 
public class FooIntegrationTests : IntegrationTests 
{ 
    ... 

    [ClassCleanup] 
    public static void FooCleanup() 
    { 
     ... 
     Cleanup(); 
    } 
} 

問題:據MSDN「[O]在一個類可以與[ClassCleanup]裝飾NLY一個方法屬性」所以我不能從基類裝飾Cleanup方法,即使我做的方法將不會被弄調用。

問題:我想這

  • 始終運行從基類的Cleanup方法,而不在繼承的類實現什麼,解決
  • 始終運行在自定義清理方法如果有的話,繼承測試類。

我不喜歡強制繼承測試類顯式調用基類,因爲我必須記得實現它。我更喜歡更優雅但簡單的(!)技術。有任何想法嗎?

注意:爲我的基地功能的單是由所有的測試類共享不起作用,因爲我對所有連接到同一個數據庫實例並行多個測試代理運行我的測試。

+0

「ClassCleanup」屬性只能分配給靜態方法。 'virtual'和'override'關鍵字只能用於實例方法。 –

+0

啊,對,我正在考慮通常的安裝/拆卸。道歉。 –

+0

靜態方法/類打破了正常的繼承規則。所以不,我不確定除了從繼承類中調用Cleanup以外,你可以在這裏做很多事情。 –

回答

0

把我的回答放在評論中,在那裏調用ClassCleanup不再起作用。

我做這一切的時候,我的工作。你所需要做的就是將基類作爲一個測試類,並且在那裏「花費」你的清理和拆卸屬性。如果你需要清理/拆卸在派生類中,只要在需要的時候,你可以ovveride虛方法:

[TestClass] 
public abstract class BaseIntegrationTest 
{ 
    [TestInitialize] 
    public void BeforeEach() { 
     // Stuff that should happen before each unit test 

     BaseTestInitialize(); 
    } 

    [TestCleanup] 
    public void AfterEach(){ 
     // Stuff that should happen after each unit test 

     BaseTestCleanup(); 
    } 

    public virtual void BaseTestInitialize() { } 
    public virtual void BaseTestCleanup() { } 
} 

有了這個結構,你在你的集成測試做的是覆蓋BaseTestCleanup ()):

[TestClass] 
public class DerivedTestClass : BaseIngetrationTest 
{ 
    public override void BaseTestCleanup() 
    { 
     // Derived cleanup 
     base.BaseTestCleanup(); 
    } 


    [TestMethod] 
    public void SomeMethod_SomeCriteria_SomeResult() 
    { 
     // Arrange 

     // Act 

     // Assert 
    } 
} 
+0

如果您需要爲每個測試進行初始化和/或清理,這是一個好主意。不幸的是,這種方法會導致嚴重的性能問題,爲*集成*測試:建立和清理數據方案正在緊張運行此數十或數百每班時間是太貴了。 –

+0

我通常會使用testcategory標記我的集成測試,因此它們只能在晚上運行,當然也可以在有人正在使用它們時運行。我從來沒有在我的持續集成中做任何類型的IO(包括磁盤)的測試。 –

+0

我們也這樣做:集成測試每天只運行兩次,並根據要求運行。但是,數據設置可能花費很多秒 - 測試套件將運行數小時,因此我們必須重新創建並刪除每個測試的場景。 –