簡體   English   中英

如何按課程隔離單元測試?

[英]How can I isolate unit tests by class?

我在訪問共享資源的幾個類中有許多“單元測試”(它們實際上是集成測試),並且我希望每個測試類僅獲取一次資源(出於性能原因)。

但是,當我在[ClassCleanup]釋放資源時遇到了問題,因為直到所有測試完成,該資源才會運行。

這是一個簡化的示例:

using Microsoft.VisualStudio.TestTools.UnitTesting;

static class State
{
    public static string Thing;
}
[TestClass]
public class ClassA
{
    [ClassInitialize]
    public static void Initialize(TestContext ctx)
    {
        State.Thing = "Hello, World!";
    }
    [ClassCleanup]
    public static void Cleanup()
    {
        State.Thing = null;
    }
    [TestMethod]
    public void TestA()
    {
        Assert.IsNotNull(State.Thing); // Verify we have a good state
    }
}
[TestClass]
public class ClassB
{
    [TestMethod]
    public void TestB()
    {
        Assert.IsNull(State.Thing); // Verify we have an uninitialized state
        // Initialize state, do stuff with it
    }
}

至少在我的機器上, TestB失敗,因為它在清除ClassA之前運行。

我讀過ClassCleanup可能比您想的晚 ,但是這並不能解釋改變行為的任何方法。 而且我意識到我不應該依賴於測試順序,但是為每個測試重新獲取資源太昂貴了,因此我想按類對它們進行分組。

我怎樣才能解決這個問題? 有沒有一種方法可以強制每個測試類作為一個單元運行,並使清除立即進行?

盡管就何時運行而言, ClassCleanup可能並不可靠,但ClassInitialize卻並非如此。 為什么不給每個依賴於此共享資源的測試類一個ClassInitialize ,以便在獲取資源本身之前就清除先前測試類(如果有)的共享資源?

唯一不釋放共享資源的時間是針對最后一個測試類,但是您可以使用ClassCleanup來處理它,因為這樣,當它運行時就不再重要了(因為在它后面將不再有測試類了) )。

有什么原因不能使該資源一次全部由整個程序集共享? 在一個測試類(或單獨的指定類)中將其設為內部或公共靜態變量,並直接從所有測試類中引用它。 資源的初始化將在[AssemblyInitialize]方法中進行,清除將在[AssemblyCleanup]中進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM