Partager via


RunFixtureAs

TAEF utilise RunFixtureAs pour exécuter des appareils de test (module, classe et fonctions de configuration et de nettoyage au niveau du test) dans un contexte autre que le ou les tests correspondants.

Conditions préalables

  • Te.Service doit être installé et exécuté sur l'ordinateur pour exécuter des frameworks de test avec des privilèges élevés à partir d'un processus Te.exe sans privilèges élevés ou pour exécuter des frameworks de test en tant que Système local.

Aperçu

RunFixtureAs peut être appliqué au niveau du module, de la classe ou du test, et sera hérité dans l’arborescence de test. Pour prendre en charge la capacité de désactiver l’héritage RunFixtureAs à un niveau donné dans l’arborescence, les métadonnées RunFixtureAs:[scope] sont également prises en charge.

Par exemple, si un module est marqué avec RunFixtureAs=System, une classe (ClassA) peut être marquée comme RunFixtureAs :Test=Default. Dans ce cas, le module et les appareils de classe s’exécutent en tant que système, mais les appareils de niveau test dans ClassA sont exécutés dans le même contexte que Te.exe (bien qu’ils soient toujours dans un processus différent du test).

La valeur des métadonnées RunFixtureAs :[scope] n’est pas héritée de l’arborescence de test ; elle s’applique uniquement à l’étendue spécifiée.

Garanties déterministes

  • Par défaut (si aucune valeur RunFixtureAs n’est spécifiée), les tests et les fixtures sont garantis de s'exécuter dans le même processus.
  • Si un appareil est marqué avec une valeur RunFixtureAs valide autre que « Test », le dispositif est exécuté dans un processus différent du test. Cela signifie que même si un test est marqué avec RunAs=Elevated et RunFixtureAs=Elevated, le test s’exécute dans un processus avec élévation de privilèges et ses configurations s’exécutent dans un processus distinct avec élévation de privilèges.
  • Les paires de fixtures correspondantes pour une étendue donnée sont toujours exécutées dans le même processus (par exemple, les fixtures de configuration et de nettoyage d’une classe sont exécutées dans le même processus).

RunFixtureAs Types

TAEF prend en charge les types RunFixtureAs suivants, qui sont spécifiés par les métadonnées de test :

Système
TAEF exécute le dispositif en tant que système local.

Note Les appareils de test que vous exécutez en tant que système local ne doivent pas créer d’interface utilisateur. Si vos appareils doivent créer ou interagir avec l’interface utilisateur, vous devez déplacer votre code lié à l’interface utilisateur dans des exécutables distincts lancés sur un bureau à partir de vos tests à l’aide de CreateProcessAsUser.

Élevé
TAEF garantit que le scénario de test est exécuté dans un processus avec élévation de privilèges en créant un processus avec élévation de privilèges pour exécuter le scénario de test si nécessaire.

Note L’utilisateur exécutant TAEF doit être membre du groupe administrateurs pour exécuter des éléments marqués avec RunFixtureAs=Elevated. Cela est dû au fait que les non-administrateurs n’ont pas de jeton fractionné à élever.

Par défaut
TAEF exécute le dispositif dans le même contexte que Te.exe (mais toujours dans un processus différent du test).

Courtier
TAEF exécute le dispositif dans un processus « Broker immersif ».

Note  

  • « Broker » n’est pris en charge que sur les systèmes d’exploitation Windows 8 et versions ultérieures.
  • La stratégie de signature de test doit être activée sur le système. Pour plus d’informations, l’option de configuration de démarrage TESTSIGNING.
  • L’exécution de tests à distance avec « RunFixtureAs=Broker » n’est actuellement pas prise en charge.
  • Lors de l’exécution avec 'RunFixtureAs=Broker', TAEF utilise le processus «TE.ProcessHost.Broker.exe» pour l’exécution des fixtures, pas «TE.ProcessHost.exe».

UIAccess
TAEF exécute le dispositif dans un processus marqué avec le niveau d’exécution UIAccess. Pour plus d’informations sur UIAccess pour les applications UI Automation, consultez la conception du mécanisme d’intégrité Windows.

Note  

  • UIAccess est uniquement pris en charge sur les systèmes d’exploitation Vista et supérieurs.
  • Les fichiers binaires TAEF doivent être en cours d’exécution à partir d’un dossier sous le dossier Program Files sur l’ordinateur.
  • L’exécution de tests à distance avec « RunFixtureAs=UIAccess » n’est actuellement pas prise en charge.
  • En exécutant avec 'RunFixtureAs=UIAccess', TAEF utilise le processus «TE.ProcessHost.UIAccess.exe» pour l’exécution du dispositif, et non «TE.ProcessHost.exe».

Test
TAEF exécute le dispositif dans le même processus ou contexte que le test.

Note Il s’agit du comportement TAEF par défaut quand aucun paramètre RunFixtureAs n’est spécifié.

RunFixtureAs :[scope]

TAEF prend en charge les valeurs RunFixtureAs :[scope] suivantes, qui sont spécifiées par les métadonnées de test.

RunFixtureAs :Module, RunFixtureAs :Assembly ou RunFixtureAs :Dll
La valeur RunFixtureAs s’applique uniquement au nœud de niveau Module dans la hiérarchie de test.

RunFixtureAs :Class
La valeur RunFixtureAs s’applique uniquement aux nœuds de niveau classe dans la hiérarchie de test.

RunFixtureAs :Method ou RunFixtureAs :Test
La valeur RunFixtureAs s’applique uniquement aux nœuds de niveau test dans la hiérarchie de test.

Marquage de tests avec 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);
};

L’exemple précédent exécutera les tests et les dispositifs de test comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestSetup et MyTestCleanup s’exécutent comme Elevated
  • MyClassSetup et MyClassCleanup s’exécutent comme System (dans le même processus que MyTestMethod)
  • MyModuleSetup et MyModuleCleanup s’exécutent comme System (dans le même processus que 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);
};

L’exemple précédent exécutera les tests et les dispositifs comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestSetup et MyTestCleanup s’exécutent comme Elevated
  • MyClassSetup et MyClassCleanup s’exécutent comme Elevated
  • MyModuleSetup et MyModuleCleanup s’exécutent comme System (dans le même processus que 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);
};

L’exemple précédent exécute les tests et les éléments de configuration comme suit :

  • MyTestMethod s’exécute en tant que Restreint
  • MyTestSetup et MyTestCleanup s’exécutent comme Elevated
  • MyClassSetup et MyClassCleanup s’exécutent en tant que système
  • MyModuleSetup et MyModuleCleanup s’exécutent comme Restricted (dans le même processus que 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);
};

L’exemple précédent exécute les tests et les configurations comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute en tant que Restreint
  • MyTestSetup et MyTestCleanup s’exécutent en tant que Elevated ; l’étendue RunFixtureAs :Test appliquée à toutes les méthodes de test dans la classe MyTests
  • MyClassSetup et MyClassCleanup s’exécutent en tant que système (au sein d’un processus différent de MyTestMethod)
  • MyModuleSetup et MyModuleCleanup s’exécutent dans le contexte de leur processus de test respectif en tant que System pour MyTestMethod et Restricted pour 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);
};

L’exemple précédent exécute les tests et les appareils comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute en tant que Restreint
  • MyTestSetup et MyTestCleanup s’exécutent comme System pour MyTestMethod et comme Elevated pour MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent en tant que système (au sein d’un processus différent de MyTestMethod)
  • MyModuleSetup et MyModuleCleanup s’exécutent dans le contexte de leur processus de test respectif (System pour MyTestMethod et Restricted pour 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);
};

L’exemple précédent exécute les tests et les configurations comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute en tant que Restreint
  • MyTestSetup et MyTestCleanup s’exécutent comme Elevated pour MyTestMethod et MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent par défaut (dans le même contexte que Te.exe est en cours d’exécution, mais dans un processus différent de MyTestMethod et MyTestMethod2)
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (au sein d’un processus différent de 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);
};

L’exemple précédent exécute les tests et les appareils comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute en tant que Restreint
  • MyTestSetup et MyTestCleanup s’exécutent dans le même processus que MyTestMethod et MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent comme Elevated
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (au sein d’un processus différent de 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);
};

L’exemple précédent exécute les tests et les préconfigurations comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute en tant que Restreint
  • MyTestSetup et MyTestCleanup s'exécutent dans le même processus que MyTestMethod et dans un processus élevé pour MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent comme Elevated
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (au sein d’un processus différent de 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);
};

L’exemple ci-dessus exécute les tests et les appareils comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute en tant que Restreint
  • MyTestSetup et MyTestCleanup s’exécutent en tant que système (au sein d’un processus différent de MyTestMethod)
  • MyClassSetup et MyClassCleanup s’exécutent comme Elevated
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (au sein d’un processus différent de MyTestMethod)