[英]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.