Partager via


RunFixtureAs

TAEF utilise RunFixtureAs pour exécuter des luminaires de test (module, classe et fonctions d’installation 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 en cours d’exécution sur la machine afin d’exécuter des appareils de test élevés à partir d’un processus de Te.exe non élevé, ou d’exécuter des luminaires de test en tant que système local.

Aperçu

RunFixtureAs peut être appliqué au niveau du module, de la classe et ou du test, et sera hérité dans l’arborescence de test. Pour prendre en charge la possibilité de refuser l’héritage RunFixtureAs à un niveau donné de 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, les luminaires de module et de classe s’exécutent en tant que Système, mais les luminaires de niveau test dans ClassA seront exécutés dans le même contexte que Te.exe (bien que toujours dans un processus différent de celui du test).

La valeur des métadonnées RunFixtureAs:[scope] n’est pas héritée dans 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 montages sont garantis pour s’exécuter dans le même processus.
  • Si un luminaire est marqué avec une valeur RunFixtureAs valide autre que « Test », le montage sera 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 montages s’exécutent dans un processus avec élévation de privilèges distinct.
  • Les paires de luminaires correspondantes pour une étendue donnée seront toujours exécutées dans le même processus (par exemple, les montages d’installation et de nettoyage d’une classe seront exécutés 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 montage en tant que système local.

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

Élevé
TAEF garantit que la fixation est exécutée dans un processus avec élévation de privilèges en créant un processus élevé dans lequel exécuter le montage si nécessaire.

Note L’utilisateur qui exécute TAEF doit être membre du groupe Administrateurs pour exécuter des montages 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 montage dans le même contexte que Te.exe (mais toujours dans un processus différent du test).

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

Remarque  

  • 'Broker' est uniquement pris en charge sur les systèmes d’exploitation Windows 8 et supérieurs.
  • La stratégie de signature de test doit être activée sur le système. Pour plus d’informations, consultez 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 de la fixation, et non « TE.ProcessHost.exe ».

UIAccess
TAEF exécute le montage dans un processus marqué avec le niveau d’exécution UIAccess. Pour plus d’informations sur UIAccess pour les applications d’automatisation de l’interface utilisateur, consultez Conception du mécanisme d’intégrité Windows.

Remarque  

  • UIAccess n’est pris en charge que sur les systèmes d’exploitation Vista et versions ultérieures.
  • Les fichiers binaires TAEF doivent être exécutés à partir d’un dossier situé sous le dossier Program Files sur l’ordinateur.
  • L’exécution de tests à distance avec « RunFixtureAs=UIAccess » n’est actuellement pas prise en charge.
  • Lors de l’exécution avec « RunFixtureAs=UIAccess », TAEF utilise le processus « TE.ProcessHost.UIAccess.exe » pour l’exécution de la fixation, et non « TE.ProcessHost.exe ».

Test
TAEF exécute le montage dans le même processus ou le même 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 des 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écute des tests et des montages comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestSetup et MyTestCleanup s’exécutent en tant que élévation de privilèges
  • MyClassSetup et MyClassCleanup s’exécutent en tant que système (dans le même processus que MyTestMethod)
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (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écute des tests et des montages comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestSetup et MyTestCleanup s’exécutent en tant que élévation de privilèges
  • MyClassSetup et MyClassCleanup s’exécutent avec élévation de privilèges
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (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 des tests et des montages comme suit :

  • MyTestMethod s’exécute comme restreint
  • MyTestSetup et MyTestCleanup s’exécutent en tant que élévation de privilèges
  • MyClassSetup et MyClassCleanup s’exécutent en tant que système
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que restreint (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 des tests et des montages comme suit :

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

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute comme restreint
  • MyTestSetup et MyTestCleanup s’exécutent en tant que système pour MyTestMethod et en tant qu’élévation de privilèges pour MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent en tant que système (dans un processus différent de MyTestMethod)
  • MyModuleSetup et MyModuleCleanup s’exécutent comme dans le contexte de leur processus de test respectif (System for 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 des tests et des montages comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute comme restreint
  • MyTestSetup et MyTestCleanup s’exécutent comme élevés pour MyTestMethod et MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent en tant que 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 (dans 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 des tests et des montages comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute comme restreint
  • MyTestSetup et MyTestCleanup s’exécutent dans le même processus que MyTestMethod et MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent avec élévation de privilèges
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (dans 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 des tests et des montages comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute comme restreint
  • MyTestSetup et MyTestCleanup s’exécutent dans le même processus que MyTestMethod et dans un processus avec élévation de privilèges pour MyTestMethod2
  • MyClassSetup et MyClassCleanup s’exécutent avec élévation de privilèges
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (dans 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 des tests et des montages comme suit :

  • MyTestMethod s’exécute en tant que système
  • MyTestMethod2 s’exécute comme restreint
  • MyTestSetup et MyTestCleanup s’exécutent en tant que système (dans un processus différent de MyTestMethod)
  • MyClassSetup et MyClassCleanup s’exécutent avec élévation de privilèges
  • MyModuleSetup et MyModuleCleanup s’exécutent en tant que système (dans un processus différent de MyTestMethod)