共用方式為


執行固定裝置

TAEF 使用 RunFixtureAs 在測試以外的環境中執行測試夾具(包括模組、類別,以及測試層級的設定和清除函式)。

先決條件

  • 必須在電腦上安裝並執行 Te.Service,才能從非提升權限的 Te.exe 進程執行提升的測試夾具,或以本機系統身分執行測試夾具。

概述

RunFixtureAs 可以在模組、類別和/或測試層級套用,而且會繼承到測試樹狀結構。 為了支援在樹狀結構的特定層級選擇不繼承 RunFixtureAs 的能力,也支援 RunFixtureAs:[scope] 中繼資料。

例如,如果模組標示為 RunFixtureAs=System,則類別 (ClassA) 可以標示為 RunFixtureAs:Test=Default。 在這種情況下,模組和類別夾具將以系統身分執行,但 ClassA 中的測試層級夾具將在與 Te.exe 相同的上下文中執行(儘管仍然處於與測試不同的進程中)。

RunFixtureAs:[scope] 的中繼資料值不會被繼承到測試樹狀結構中,它僅適用於指定的範圍。

確定性保證

  • 根據預設 (如果未指定 RunFixtureAs 值) ,則保證測試和固定器會在相同的進程內執行。
  • 如果治具標示為有效的非 'Test' 的 RunFixtureAs 值,則該治具將在與測試不同的進程中執行。 這表示,即使測試被標示為 RunAs=Elevated 和 RunFixtureAs=Elevated,測試將在提高許可權的進程中執行,而其測試組件也將在個別的提高許可權進程中執行。
  • 指定範圍的相符夾具組一律會在相同的程序內執行 (例如,類別的設定和清除夾具將在相同程序內執行)。

RunFixtureAs 類型

TAEF 支援下列 RunFixtureAs 類型,這些類型是由測試中繼資料所指定:

系統
TAEF 會以本機系統的形式執行夾具。

注意 您以本機系統身分執行的測試裝置不應建立任何 UI。 如果您的測試樣本需要建立 UI 或與其互動,您必須將與 UI 相關的程式碼移動到單獨的可執行檔中,這些可執行檔會使用 CreateProcessAsUser 從桌面上進行測試時啟動。

提升的
TAEF 會視需要產生提升許可權的進程,並於該進程中執行固定裝置,以確保固定裝置在提升許可權的進程中執行。

注意 執行 TAEF 的使用者必須是系統管理員群組的成員,才能執行標示為 RunFixtureAs=Elevated 的程式碼段。 這是因為非系統管理員沒有拆分權杖來進行提升。

預設
TAEF 會在與 Te.exe 相同的環境中執行夾具,但仍在與測試不同的進程中。

代理
TAEF 會在「沉浸式代理程式」程式中執行固定裝置。

注意  

  • 「代理程式」僅支援 Windows 8 及更高版本的作業系統。
  • 必須在系統上啟用測試簽署原則。 如需詳細資訊,請參閱 TESTSIGNING 開機組態選項
  • 目前不支援使用 'RunFixtureAs=Broker' 遠端執行測試。
  • 使用 'RunFixtureAs=Broker' 執行時,TAEF 會使用「TE.ProcessHost.Broker.exe」程序來執行夾具,而不是「TE.ProcessHost.exe」。

UIAccess
TAEF 會在具有 UIAccess 執行層級標記的進程中執行測試夾具。 如需 UI 自動化應用程式 UIAccess 的相關資訊,請參閱 Windows 完整性機制設計

注意  

  • UIAccess 僅在 Vista 和更高版本的作業系統上受支援。
  • TAEF 二進位檔必須從電腦上 Program Files 資料夾下的資料夾執行。
  • 目前不支援使用 'RunFixtureAs=UIAccess' 從遠端執行測試。
  • 使用 'RunFixtureAs=UIAccess' 執行時,TAEF 會使用 「TE.ProcessHost.UIAccess.exe」 程式來執行夾具,而不是「TE.ProcessHost.exe」。


TAEF 會在與測試相同的程式或情境中執行測試環境。

注意 這是未指定 RunFixtureAs 設定時的預設 TAEF 作用。

RunFixtureAs:[範圍]

TAEF 支援下列 RunFixtureAs:[scope] 值,這些值是由測試中繼資料所指定。

RunFixtureAs:ModuleRunFixtureAs:AssemblyRunFixtureAs:Dll
RunFixtureAs 值只會套用至測試階層中的模組層級節點。

RunFixtureAs:類別
RunFixtureAs 值只會套用至測試階層中的類別層級節點。

RunFixtureAs:MethodRunFixtureAs: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 會以提升許可權的形式執行
  • 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 會以限制權限身分執行
  • MyTestSetup 和 MyTestCleanup 會以高權限執行
  • MyClassSetup 和 MyClassCleanup 會以系統身分執行
  • MyModuleSetup 和 MyModuleCleanup 會以受限 (在與 MyTestMethod 相同的進程內) 執行
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 會以受限身分執行
  • MyTestSetup 和 MyTestCleanup 會以提升許可權的形式執行,RunFixtureAs:Test 範圍設定將應用於 MyTests 類別內的所有測試方法。
  • MyClassSetup 和 MyClassCleanup 會以系統身分執行 (在與 MyTestMethod 不同的進程中)
  • MyModuleSetup 和 MyModuleCleanup 會在其各自的測試過程中執行(在 MyTestMethod 中以系統的上下文執行,在 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 會以受限身分執行
  • MyTestSetup 和 MyTestCleanup 在 MyTestMethod 中以系統身分執行,而在 MyTestMethod2 中以提升許可權身分執行。
  • MyClassSetup 和 MyClassCleanup 會以系統身分執行 (在與 MyTestMethod 不同的進程中)
  • MyModuleSetup 和 MyModuleCleanup 會在其各自測試程序的內容中執行(系統為 MyTestMethod,受限為 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 會以受限身分執行
  • MyTestSetup 和 MyTestCleanup 以提升的權限執行於 MyTestMethod 和 MyTestMethod2
  • MyClassSetup 和 MyClassCleanup 會以預設值執行(在與 Te.exe 當前執行相同的環境中,但在與 MyTestMethod 和 MyTestMethod2 不同的進程中)
  • MyModuleSetup 和 MyModuleCleanup 會以系統身分執行 (在與 MyTestMethod 不同的進程中)
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 會以受限身分執行
  • MyTestSetup 和 MyTestCleanup 會在與 MyTestMethod 和 MyTestMethod2 相同的程式中執行
  • MyClassSetup 和 MyClassCleanup 會以提升許可權的形式執行
  • MyModuleSetup 和 MyModuleCleanup 會以系統身分執行 (在與 MyTestMethod 不同的進程中)
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 會以受限身分執行
  • MyTestSetup 和 MyTestCleanup 會在與 MyTestMethod 相同的程序內執行,並在 MyTestMethod2 的提升許可權程序中執行。
  • MyClassSetup 和 MyClassCleanup 會以提升許可權的形式執行
  • MyModuleSetup 和 MyModuleCleanup 會以系統身分執行 (在與 MyTestMethod 不同的進程中)
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 會以受限身分執行
  • MyTestSetup 和 MyTestCleanup 會以系統身分執行 (在與 MyTestMethod 不同的進程中)
  • MyClassSetup 和 MyClassCleanup 會以提升許可權的形式執行
  • MyModuleSetup 和 MyModuleCleanup 會以系統身分執行 (在與 MyTestMethod 不同的進程中)