MSTest 為測試類別和測試方法提供定義完善的生命週期,允許在測試執行程式的各個階段執行設定和卸載作業。 生命週期可以分成下列三個階段:
- 元件層級生命週期
- 類別層級生命週期
- 測試層級生命週期
生命週期事件的執行是從最高層級(元件)到最低層級(測試方法)。 執行順序如下:
- 組件初始化
- 類別初始化 (針對每個測試類別)
- 測試初始化 (針對每個測試方法)
- 執行測試
- 測試清除 (每個測試方法)
- 類別清除 (針對每個測試類別)
- 組件清理
元件層級生命週期
元件生命週期描述整個元件的生命週期,其中包含所有測試類別和方法。 為了管理元件生命週期,MSTest 提供 AssemblyInitialize 和 AssemblyCleanup 屬性。 若要深入了解這些屬性,請參閱 AssemblyInitialize 和 AssemblyCleanup 檔。
類別層級生命週期
測試類別生命週期是指元件內個別測試類別的生命週期,而且可以使用 ClassInitialize 和 ClassCleanup 屬性來實作。 這些屬性可讓您分別定義在類別中所有測試之前和之後執行的設定和卸除方法。 如需這些屬性的詳細資訊,請參閱 ClassInitialize 和 ClassCleanup 檔。 類別層級生命週期只會在每個類別執行一次,而不論類別中的測試數目為何。
測試層級生命周期
測試層級生命週期會針對每個測試方法執行。 對於參數化測試,每個參數集都會被視為個別的測試方法,而且會針對每個參數集執行生命週期。 測試層級生命週期可以分組到設定、執行和清除,並支援多種實作方式的設定和清除。
設定
測試層級生命周期的設定階段負責在每個測試方法執行之前準備測試環境。 這可以使用 TestInitialize 屬性或藉由在測試類別中實作建構函式來達成。 在繼承的情況下,方法的執行 TestInitialize 會遵循從基類到衍生類別的順序。 如果測試類別實作建構函式,則會在 TestInitialize 方法之前執行。 若要深入瞭解 TestInitialize 屬性,請參閱 測試層級屬性 檔。
備註
不同於類別建構函式, TestInitialize 方法可以是異步方法,也支援屬性使用方式,例如 TimeoutAttribute。
執行
執行階段是執行實際測試方法的階段。 如果測試方法傳回Task或 ValueTask,將會等候測試方法。
警告
在異步測試方法的情況下,不會提供 SynchronizationContext 。 這不適用於 UITestMethod UWP和 WinUI 的測試,因為它們在具有 SynchronizationContext的UI線程上執行。
清理
測試層級生命週期的清除階段負責在每個測試方法執行之後清除測試環境。
這可以使用TestCleanup屬性或藉由在測試類別中實作IDisposable/IAsyncDisposable介面來達成。
如果測試類別實作 IDisposable 或 IAsyncDisposable,那麼其 Dispose/DisposeAsync 方法會在 TestCleanup 方法之後執行。
如果是繼承,方法的執行 TestCleanup 會遵循從衍生類別到基類的順序。
若要深入瞭解 TestInitialize 屬性,請參閱 測試層級屬性 檔。
訂單
測試層級生命週期的完整順序如下:
- 建立測試類別的實例
- 如果存在,請設定
TestContext屬性 - 執行 TestInitialize (如果已實作)
- 測試方法執行
- 使用測試結果更新
TestContext(例如Outcome屬性) - 實作時執行TestCleanup
- 實作時執行 DisposeAsync
- 如果已實作,請執行 Dispose