RunFixtureAs
TAEF 會使用 RunFixtureAs 在對應測試 (s) 以外的內容中執行測試裝置, (模組、類別和測試層級設定和清除函式) 。
先決條件
- 必須在電腦上安裝並執行Te.Service,才能從未提升許可權的Te.exe程式執行提升許可權的測試裝置,或以本機系統的形式執行測試裝置。
概述
RunFixtureAs 可以在模組、類別和或測試層級套用,而且會繼承至測試樹狀結構。 為了支援在樹狀結構中的指定層級退出宣告 RunFixtureAs 繼承的能力,也支援 RunFixtureAs:[scope] 中繼資料。
例如,如果模組標示為 RunFixtureAs=System,則類別 (ClassA) 可以標示為 RunFixtureAs:Test=Default。 在這種情況下,模組和類別裝置會以 System 的形式執行,但 ClassA 中的測試層級裝置將會在與Te.exe (相同的內容中執行,但仍然在與測試) 不同的進程中。
RunFixtureAs:[scope] 中繼資料值不會繼承在測試樹狀結構中;它只適用于指定的範圍。
確定性保證
- 根據預設, (如果未指定 RunFixtureAs 值) ,則保證會在相同進程中執行測試和裝置。
- 如果裝置標示了 'Test' 以外的有效 RunFixtureAs 值,裝置將會在與測試不同的進程中執行。 這表示即使測試是以 RunAs=Elevated 和 RunFixtureAs=Elevated 標示,測試仍會在提升許可權的進程中執行,而且其裝置會在個別提升許可權的進程中執行。
- 比對指定範圍的裝置組一律會在相同的進程內執行 (例如,類別的設定和清除裝置將會在相同的進程內執行) 。
RunFixtureAs 類型
TAEF 支援下列 RunFixtureAs 類型,這些類型是由測試中繼資料所指定:
系統
TAEF 會以本機系統的形式執行裝置。
注意 您以本機系統身分執行的測試裝置不應建立任何 UI。 如果您的裝置需要建立或與 UI 互動,您必須使用 CreateProcessAsUser,將 UI 相關程式碼移至桌面上啟動的個別可執行檔。
升高
TAEF 可確保裝置會在提升許可權的進程中執行,方法是在必要時繁衍要在其中執行裝置的提升許可權進程。
注意 執行 TAEF 的使用者必須是 administrators 群組的成員,才能執行以 RunFixtureAs=Elevated 標示的裝置。 這是因為非系統管理員沒有要提高許可權的分割權杖。
預設
TAEF 會在與Te.exe (相同的內容中執行裝置,但仍在與測試) 不同的進程中。
代理
TAEF 會在「沈浸式代理人」程式中執行裝置。
注意
- 只有Windows 8和更高版本的作業系統才支援 'Broker'。
- 必須在系統上啟用測試簽署原則。 如需詳細資訊, 請參閱 TESTSIGNING 開機組態選項。
- 目前不支援使用 'RunFixtureAs=Broker' 從遠端執行測試。
- 使用 'RunFixtureAs=Broker' TAEF 執行時,會使用 「TE.ProcessHost.Broker.exe」 進程來執行裝置,而不是 「TE.ProcessHost.exe」。
UIAccess
TAEF 會在標示為 UIAccess 執行層級的進程中執行裝置。 如需 UI 自動化應用程式 UIAccess 的相關資訊,請參閱 Windows 完整性機制設計。
注意
- 只有 Vista 和更高版本的作業系統才支援 UIAccess。
- TAEF 二進位檔必須從電腦上的 Program Files 資料夾下的資料夾執行。
- 目前不支援使用 'RunFixtureAs=UIAccess' 從遠端執行測試。
- 使用 'RunFixtureAs=UIAccess' TAEF 執行時,會使用 「TE.ProcessHost.UIAccess.exe」 進程來執行裝置,而不是 「TE.ProcessHost.exe」。
測試
TAEF 會在與測試相同的進程或內容中執行裝置。
注意 未指定 RunFixtureAs 設定時,這是預設的 TAEF 行為。
RunFixtureAs:[scope]
TAEF 支援下列 RunFixtureAs:[scope] 值,這些值是由測試中繼資料所指定。
RunFixtureAs:Module、 RunFixtureAs:Assembly或 RunFixtureAs:Dll
RunFixtureAs 值只會套用至測試階層中的模組層級節點。
RunFixtureAs:Class
RunFixtureAs 值只會套用至測試階層中的類別層級節點。
RunFixtureAs:Method 或 RunFixtureAs:Test
RunFixtureAs 值只會套用至測試階層中的測試層級節點。
使用 RunFixtureAs 標記測試
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
TEST_CLASS(MyTests);
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestSetup 和 MyTestCleanup 會以提升許可權執行
- MyClassSetup 和 MyClassCleanup 會在與 MyTestMethod) 相同的進程中以系統 (執行
- MyModuleSetup 和 MyModuleCleanup 會在與 MyTestMethod) 相同的進程中以系統 (執行
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestSetup 和 MyTestCleanup 會以提升許可權執行
- MyClassSetup 和 MyClassCleanup 會以 Elevated 身分執行
- MyModuleSetup 和 MyModuleCleanup 會在與 MyTestMethod) 相同的進程中以系統 (執行
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"System")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 會以 Restricted 的形式執行
- MyTestSetup 和 MyTestCleanup 會以提升許可權執行
- MyClassSetup 和 MyClassCleanup 以系統身分執行
- MyModuleSetup 和 MyModuleCleanup 會在與 MyTestMethod) 相同的進程中以 Restricted (執行
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"System")
TEST_METHOD_PROPERTY(L"RunFixtureAs:Test", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestMethod2 會以 Restricted 的形式執行
- MyTestSetup 和 MyTestCleanup 會以提升許可權執行;RunFixtureAs:Test 範圍套用至 MyTests 類別內的所有測試方法
- MyClassSetup 和 MyClassCleanup 會在與 MyTestMethod) 不同的進程中以 System (身分執行
- MyModuleSetup 和 MyModuleCleanup 會在其各自的測試程式內容中執行, (System for MyTestMethod 和 Restricted for MyTestMethod2)
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"System")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestMethod2 會以 Restricted 的形式執行
- MyTestSetup 和 MyTestCleanup 會以 System for MyTestMethod 和 Elevated for MyTestMethod2 的形式執行
- MyClassSetup 和 MyClassCleanup 會在與 MyTestMethod) 不同的進程中以 System (身分執行
- MyModuleSetup 和 MyModuleCleanup 會在其各自的測試程式內容中執行, (System for MyTestMethod 和 Restricted for MyTestMethod2)
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Default")
TEST_CLASS_PROPERTY(L"RunFixtureAs:Test", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestMethod2 會以 Restricted 的形式執行
- MyTestSetup 和 MyTestCleanup 會針對 MyTestMethod 和 MyTestMethod2 執行為 Elevated
- MyClassSetup 和 MyClassCleanup 會在與目前執行Te.exe相同的內容中,以預設 (的形式執行,但在與 MyTestMethod 和 MyTestMethod2 不同的進程中)
- MyModuleSetup 和 MyModuleCleanup 會在與 MyTestMethod) 不同的進程中以 System (執行
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
MODULE_PROPERTY(L"RunFixtureAs:Test", L"Test")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestMethod2 會以 Restricted 的形式執行
- MyTestSetup 和 MyTestCleanup 會在與 MyTestMethod 和 MyTestMethod2 相同的進程中執行
- MyClassSetup 和 MyClassCleanup 會以 Elevated 身分執行
- MyModuleSetup 和 MyModuleCleanup 會在與 MyTestMethod) 不同的進程中以 System (執行
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
MODULE_PROPERTY(L"RunFixtureAs:Test", L"Test")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestMethod2 會以 Restricted 的形式執行
- MyTestSetup 和 MyTestCleanup 會在與 MyTestMethod 相同的進程中執行,並在 MyTestMethod2 的提升許可權進程中執行
- MyClassSetup 和 MyClassCleanup 會以 Elevated 身分執行
- MyModuleSetup 和 MyModuleCleanup 會在與 MyTestMethod) 不同的進程中以 System (執行
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs:Class", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述範例會執行測試和裝置,如下所示:
- MyTestMethod 以系統身分執行
- MyTestMethod2 會以 Restricted 的形式執行
- MyTestSetup 和 MyTestCleanup 會在與 MyTestMethod) 不同的進程中以系統 (執行
- MyClassSetup 和 MyClassCleanup 會以 Elevated 身分執行
- MyModuleSetup 和 MyModuleCleanup 會在與 MyTestMethod) 不同的進程中以 System (執行