簡體   English   中英

NUnit 3:禁止並行運行測試

[英]NUnit 3: Forbid tests to run in parallel

我安裝了最新的 NUnit(3.2.0),並且我的所有測試都並行運行。 它可能看起來像是理想的行為,但我沒有要求它,實際上它破壞了我的一些測試。 我在[OneTimeSetUp]有一些依賴於線程的初始化,似乎我無法強制 NUnit 按順序運行我的測試。 我已經閱讀了文檔,它指出默認情況下測試不是並行運行的,但實際上它們是!

此外,我嘗試添加以下屬性: [assembly: Parallelizable(ParallelScope.None)] — 沒有運氣。

有人知道如何改變這種行為嗎?

PS 我使用 ReSharper 運行它,但也嘗試使用 MSVS 插件。


UPD:我正在使用 MVVM Light DispatcherHelper.Initialize() (在[OneTimeSetUp] )來存儲調度程序對象,該對象稍后由幾個測試使用。 如果線程不同(在測試和設置方法之間),則被測操作將異步執行並且我的測試失敗。

我檢查了不同測試中的線程 ID,它們都不同。


UPD2:摘自文檔:

NUnit 3.0 框架可以在程序集中並行運行測試 這是一個完全獨立於引擎並行測試執行的工具,盡管可以在同一個測試運行中使用兩者。

默認情況下,不會發生並行執行 屬性用於指示哪些測試可以並行運行以及它們與其他測試的關系。

如果這並不意味着在明確指定之前不應並行運行程序集中的測試,那么這意味着什么? 為什么[assembly: Parallelizable(ParallelScope.None)]對測試並行執行沒有影響?


UPD3:問題的答案可能會在下面找到,但是如果您(像我一樣)被DispatcherHelper.Initialize()卡住了,您只需要從OneTimeSetUp刪除此初始化,並在每個使用調度程序的測試中添加以下行:

DispatcherHelper.Reset();
DispatcherHelper.Initialize();

NUnit 不保證您的所有測試都在同一線程上運行,因此觀察到您的測試在不同線程上運行並不意味着它們是並行運行的。

該文檔僅說明測試將按順序或並行運行。 您可能會認為這意味着它們在同一個線程上運行,但是內部實現可能需要在不同線程上運行測試的原因有很多。 Timeout 是一個例子,如果測試超時,我們會生成一個線程並殺死它,但還有很多其他的。

並行測試運行是 NUnit 3 的新功能,因此內部實現從 NUnit 2 更改。強制一個線程內的所有測試在同一線程上運行的屬性可能很有用,因此請隨時提交增強請求

抱歉,我不熟悉 MVVM Light,因此我無法建議將回送至 OneTimeSetup 線程的方法。

更新- 由於這是 web 和 async 的常見用法,NUnit 團隊決定提供一個屬性,該屬性將要求在與夾具的OneTimeSetup相同的線程上運行測試。 這將出現在下一個版本 3.4 或修補程序 3.2.1 版本中。 如果您想跟蹤進度,請參閱問題拉取請求

更新 2 - 您現在可以將SingleThreadedAttribute添加到 TestFixture 以向運行程序指示OneTimeSetUpOneTimeTearDown和所有子測試必須在同一線程上運行。

您可以通過添加[NonParallelizable]屬性來阻止測試並行運行,該屬性可以在測試、類和程序集級別添加。

暫無
暫無

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

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