次の方法で共有


RunFixtureAs

TAEF は RunFixtureAs を使用して、テスト フィクスチャ (モジュール、クラス、およびテスト レベルのセットアップ関数とクリーンアップ関数) を、該当するテスト以外のコンテキストで実行します。

前提条件

  • 非管理者特権の Te.exe プロセスから管理者特権のテスト フィクスチャを実行したり、ローカル システムとしてテスト フィクスチャを実行したりするには、Te.Service をマシンにインストールして実行する必要があります。

概要

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 を作成または操作する必要がある場合は、テストから CreateProcessAsUser を使用してデスクトップで起動される別の実行可能ファイルに UI 関連のコードを移動する必要があります。

Elevated
TAEF は、必要に応じてフィクスチャを実行する管理者特権のプロセスを生成することによって、フィクスチャが管理者特権のプロセスで実行されるようにします。

TAEF を実行しているユーザーは、RunFixtureAs=Elevated でマークされたフィクスチャを実行するために、管理者グループのメンバーである必要があります。 これは、非管理者は管理者特権を得るための分割トークンを持っていないという事実が理由です。

既定値
TAEF は、Te.exe と同じコンテキストでフィクスチャを実行します (ただし、テストとは異なるプロセス内で実行されます)。

ブローカー
TAEF は、"イマーシブ ブローカー" プロセスでフィクスチャを実行します。

Note  

  • "Broker" は、Windows 8 以降のオペレーティング システムでのみサポートされています。
  • システムでテスト署名ポリシーを有効にする必要があります。 詳細については、「TESTSIGNING ブート構成オプション」を参照してください。
  • "RunFixtureAs=Broker" を使用してテストをリモートで実行することは、現在サポートされていません。
  • "RunFixtureAs=Broker" を使用して実行する場合、TAEF はフィクスチャを実行するために、"TE.ProcessHost.exe" ではなく "TE.ProcessHost.Broker.exe" プロセスを使用します。

UIAccess
TAEF は、UIAccess 実行レベルでマークされたプロセスでフィクスチャを実行します。 UI オートメーション アプリケーションの UIAccess の詳細については、「Windows 整合性メカニズムの設計」を参照してください。

Note  

  • UIAccess は、Vista 以降のオペレーティング システムでのみサポートされています。
  • TAEF バイナリは、コンピューターの Program Files フォルダーの下にあるフォルダーから実行される必要があります。
  • "RunFixtureAs=UIAccess" を使用してテストをリモートで実行することは、現在サポートされていません。
  • "RunFixtureAs=UIAccess" を使用して実行する場合、TAEF はフィクスチャを実行するために、"TE.ProcessHost.exe" ではなく "TE.ProcessHost.UIAccess.exe" プロセスを使用します。

テスト
TAEF は、テストと同じプロセスまたはコンテキストでフィクスチャを実行します。

これは、RunFixtureAs 設定が指定されていない場合の既定の TAEF 動作です。

RunFixtureAs:[scope]

TAEF では、テスト メタデータによって指定される、以下の RunFixtureAs:[scope] 値がサポートされています。

RunFixtureAs:ModuleRunFixtureAs: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 が管理者特権で実行される
  • 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 とは異なるプロセス内で)