簡體   English   中英

如何在每個 class 之后運行 ClassCleanup (MSTest) 並進行測試?

[英]How to run ClassCleanup (MSTest) after each class with test?

我有幾個帶有測試套件的課程。

每個測試 class 從 ClassInitialize 開始並由 ClassCleanup 完成。 我的問題是在每個 class 的末尾都沒有調用 ClassCleanup,只有在三個類的所有測試之后才調用它。 我可以解決這個問題嗎? 謝謝!

[ClassInitialize]
public static void SetUpBrowser(TestContext context)
{
    pageObjectBase.SetBrowser("chrome");
    pagesManager.GetPageObjectBase();
}

[TestMethod]
public void FindCriticalBug()
{
    bla-bla-bla();
}

[ClassCleanup]
public static void CloseBrowser()
{
    pageObjectBase.Stop();
    pagesManager.GeneralClearing();
}

測試是無序運行的,包括跨類的測試。 請參閱此博客文章:

https://docs.microsoft.com/archive/blogs/ploeh/classcleanup-may-run-later-than-you-think

報價:

無論如何,這是我的輸出窗口的結果:

 AssemblyInitialize TestClass1: ClassInitialize TestClass1: TestInitialize TestClass1: MyTestCase1 TestClass1: TestCleanup TestClass2: ClassInitialize TestClass2: TestInitialize TestClass2: MyTestCase2 TestClass2: TestCleanup TestClass1: ClassCleanup TestClass2: ClassCleanup AssemblyCleanup

...這並不意味着 TestClass1 的 ClassCleanup 在類中的最后一個測試用例之后立即執行! 實際上,它一直等到所有測試用例都執行完畢,然后與 TestClass2 的 ClassCleanup 一起執行。

起初這讓我感到驚訝,但這顯然只是因為我沒有真正考慮清楚:由於測試原則上是無序的,因此不能保證 TestClass1 中的所有測試都立即連續執行。 從理論上講,執行引擎可能會從 TestClass1 中選擇一個測試用例,然后從 TestClass2 中選擇一個,然后從 TestClass1 中選擇另一個,依此類推。既然是這種情況,就不能保證在新的測試類出現之前已經執行了一個測試類的所有測試初始化,因此,所有 ClassCleanup 方法也可以推遲到所有測試用例都執行完畢。

不幸的是,如果這對您不起作用,您將不得不查看有序測試或不同的單元測試框架。

有一個名為TestCleanupAttribute的不同屬性,它將在每次測試后運行。

還有一個屬性要在每個測試之前運行,稱為TestInitializeAttribute

這是它們一起運行的示例。

[TestClass]
public class MyTests
{
   [ClassInitialize]
   public void ClassInitialize() { Debug.Print("Running ClassInitialize"); }

   [TestInitialize]
   public void TestInitialize() { Debug.Print("Running    TestInitialize"); }

   [TestMethod]
   public void TestMethod1() { Debug.Print("Running       TestMethod1....."); }

   [TestMethod]
   public void TestMethod2() { Debug.Print("Running       TestMethod2....."); }

   [TestCleanup]
   public void TestCleanup() { Debug.Print("Running    TestCleanup"); }

   [ClassCleanup]
   public void ClassCleanup() { Debug.Print("Running ClassCleanup"); }
}

這將導致

Running ClassInitialize
Running    TestInitialize
Running       TestMethod1.....
Running    TestCleanup
Running    TestInitialize
Running       TestMethod2.....
Running    TestCleanup
Running ClassCleanup

我做了一些測試,並使用類中的靜態字段來“告訴”所有方法都運行的 TestCleanup 方法似乎有效。 然后,您可以刪除 ClassCleanup 並執行以下操作:

private static int runs = 0;

[ClassInitialize]
public static void SetUpBrowser(TestContext context)
{
    pageObjectBase.SetBrowser("chrome");
    pagesManager.GetPageObjectBase();
}

[TestMethod]
public void FindCriticalBug()
{
    runs++;
    bla-bla-bla();
}

[TestMethod]
public void FindCriticalBug2()
{
    runs++;
    ble-ble-ble();
}

[TestCleanup]
public static void CloseBrowser()
{
    if (runs == 2)
    {
        pageObjectBase.Stop();
        pagesManager.GeneralClearing();
    }
}

我會留遠離這種解決方案雖然,但如果你有沒有其他選擇,你可以不重構你的設計中使用所提供的生命周期,它可能是一個選項。 您可能會在這里變得更有趣,並編寫自己的基類來計算執行次數並使用反射獲取測試方法的總量來自動化這些東西。

正常的單元測試是“無序的”,這意味着它們可以按任何順序運行。 您可能正在尋找諸如有序測試之類的東西(請參閱您對多米尼克的評論)。 有序測試是一個特殊的單元測試項目。 運行有序測試時,測試將運行您如何配置它們,並在完成后拆除測試類。 如果單元測試必須按順序運行,那就是測試相互干擾的味道。 干擾測試是不可靠的,因為它們失敗是因為較早的測試留下了一些錯誤數據或測試本身失敗。 您無法知道您的代碼真正有什么問題。

您可以使用ClassCleanupBehavior來決定何時完成清理:
MSTest v2:測試生命周期屬性

您還可以自定義何時調用清理方法。 默認情況下,在執行程序集的所有測試后調用 cleanup 方法。 您可以通過使用ClassCleanupBehavior枚舉來更早地調用。

ClassCleanupBehavior.EndOfAssembly :在程序集的所有測試執行后調用ClassCleanupBehavior.EndOfClass :在 class 的所有測試執行后調用 您可以使用程序集屬性ClassCleanupExecution自定義全局行為。

 ClassCleanupExecution(ClassCleanupBehavior.EndOfClass)] [TestClass] public class TestClass1 { [ClassCleanup(ClassCleanupBehavior.EndOfAssembly)] public static void ClassCleanup() { Console.WriteLine("ClassCleanup"); } [TestMethod] public void Test1() { } }

暫無
暫無

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

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