Compartir a través de


RunFixtureAs

TAEF usa RunFixtureAs para ejecutar accesorios de prueba (módulo, clase y funciones de configuración y limpieza de nivel de prueba) en un contexto distinto de las pruebas correspondientes.

Requisitos previos

  • Te.Service debe instalarse y ejecutarse en la máquina con el fin de ejecutar accesorios de prueba elevados desde un proceso de Te.exe sin privilegios elevados, o para ejecutar accesorios de prueba como sistema local.

Visión general

RunFixtureAs se puede aplicar en el nivel de módulo, clase o prueba, y se heredará el árbol de prueba. Para admitir la posibilidad de no participar en la herencia de RunFixtureAs en un nivel determinado en el árbol, también se admiten metadatos de RunFixtureAs:[scope].

Por ejemplo, si un módulo está marcado con RunFixtureAs=System, una clase (ClassA) se puede marcar como RunFixtureAs:Test=Default. En tal caso, los accesorios de módulo y clase se ejecutarán como Sistema, pero los accesorios de nivel de prueba dentro de ClassA se ejecutarán en el mismo contexto que Te.exe (aunque todavía en un proceso diferente al de la prueba).

El valor de metadatos RunFixtureAs:[scope] no se hereda del árbol de prueba; solo se aplica al ámbito especificado.

Garantías deterministas

  • De forma predeterminada (si no se especifican valores RunFixtureAs), se garantiza que las pruebas y los accesorios se ejecuten dentro del mismo proceso.
  • Si un accesorio está marcado con un valor de RunFixtureAs válido distinto de "Test", el accesorio se ejecutará en un proceso diferente al de la prueba. Esto significa que incluso si una prueba está marcada con RunAs=Elevated y RunFixtureAs=Elevated, la prueba se ejecutará en un proceso con privilegios elevados y sus accesorios se ejecutarán en un proceso con privilegios elevados independiente.
  • Los pares de accesorios coincidentes para un ámbito determinado siempre se ejecutarán dentro del mismo proceso (por ejemplo, la configuración y los accesorios de limpieza de una clase se ejecutarán dentro del mismo proceso).

Tipos RunFixtureAs

TAEF admite los siguientes tipos RunFixtureAs, especificados por los metadatos de prueba:

Sistema
TAEF ejecuta el accesorio como sistema local.

Nota Los accesorios de prueba que se ejecutan como sistema local no deben crear ninguna interfaz de usuario. Si los accesorios necesitan crear o interactuar con la interfaz de usuario, debe mover el código relacionado con la interfaz de usuario a archivos ejecutables independientes que se inician en un escritorio desde las pruebas mediante CreateProcessAsUser.

Elevado
TAEF garantiza que el accesorio se ejecute en un proceso elevado generando un proceso elevado en el que ejecutar el accesorio si es necesario.

Nota El usuario que ejecuta TAEF debe ser miembro del grupo de administradores para poder ejecutar accesorios marcados con RunFixtureAs=Elevated. Esto se debe al hecho de que los no administradores no tienen un token dividido para elevar.

Predeterminado
TAEF ejecuta el accesorio en el mismo contexto que Te.exe (pero aún dentro de un proceso diferente al de la prueba).

Corredor
TAEF ejecuta el accesorio en un proceso de "Agente inmersivo".

Note  

  • "Broker" solo se admite en sistemas operativos Windows 8 y superiores.
  • La directiva de firma de pruebas debe estar habilitada en el sistema. Para obtener más información, la opción de configuración de arranque TESTSIGNING.
  • Actualmente no se admite la ejecución de pruebas con "RunFixtureAs=Broker".
  • Al ejecutar con 'RunFixtureAs=Broker' TAEF usará el proceso de "TE.ProcessHost.Broker.exe" para la ejecución de accesorios, no "TE.ProcessHost.exe".

UIAccess
TAEF ejecuta el accesorio en un proceso marcado con el nivel de ejecución UIAccess. Para obtener información sobre UIAccess para las aplicaciones de automatización de la interfaz de usuario, consulte el diseño del mecanismo de integridad de Windows.

Note  

  • UIAccess solo se admite en Vista y sistemas operativos superiores.
  • Los archivos binarios de TAEF deben ejecutarse desde una carpeta en la carpeta Archivos de programa del equipo.
  • Actualmente no se admite la ejecución de pruebas con "RunFixtureAs=UIAccess".
  • Al ejecutar con 'RunFixtureAs=UIAccess' TAEF usará el proceso de "TE.ProcessHost.UIAccess.exe" para la ejecución de accesorios, no "TE.ProcessHost.exe".

Prueba
TAEF ejecuta el accesorio en el mismo proceso o contexto que la prueba.

Nota Este es el comportamiento predeterminado de TAEF cuando no se especifica ninguna configuración de RunFixtureAs.

RunFixtureAs:[scope]

TAEF admite los siguientes valores RunFixtureAs:[scope], especificados por los metadatos de prueba.

RunFixtureAs:Module, RunFixtureAs:Assembly o RunFixtureAs:Dll
El valor RunFixtureAs solo se aplicará al nodo Nivel de módulo de la jerarquía de prueba.

RunFixtureAs:Class
El valor RunFixtureAs solo se aplicará a los nodos de nivel de clase de la jerarquía de prueba.

RunFixtureAs:Method o RunFixtureAs:Test
El valor RunFixtureAs solo se aplicará a los nodos de nivel de prueba de la jerarquía de pruebas.

Marcar pruebas con 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestSetup y MyTestCleanup se ejecutan como con privilegios elevados
  • MyClassSetup y MyClassCleanup se ejecutan como System (dentro del mismo proceso que MyTestMethod)
  • MyModuleSetup y MyModuleCleanup se ejecutan como System (dentro del mismo proceso 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestSetup y MyTestCleanup se ejecutan como con privilegios elevados
  • MyClassSetup y MyClassCleanup se ejecutan como con privilegios elevados
  • MyModuleSetup y MyModuleCleanup se ejecutan como System (dentro del mismo proceso 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como Restringido
  • MyTestSetup y MyTestCleanup se ejecutan como con privilegios elevados
  • MyClassSetup y MyClassCleanup se ejecutan como System
  • MyModuleSetup y MyModuleCleanup se ejecutan como restringidos (dentro del mismo proceso 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestMethod2 se ejecuta como Restringido
  • MyTestSetup y MyTestCleanup se ejecutan como Elevados; El ámbito RunFixtureAs:Test aplicado a todos los métodos de prueba dentro de la clase MyTests
  • MyClassSetup y MyClassCleanup se ejecutan como System (dentro de un proceso diferente que MyTestMethod)
  • MyModuleSetup y MyModuleCleanup se ejecutan como dentro del contexto de su proceso de prueba respectivo (System for MyTestMethod y 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestMethod2 se ejecuta como Restringido
  • MyTestSetup y MyTestCleanup se ejecutan como System for MyTestMethod y como Elevated for MyTestMethod2
  • MyClassSetup y MyClassCleanup se ejecutan como System (dentro de un proceso diferente que MyTestMethod)
  • MyModuleSetup y MyModuleCleanup se ejecutan como dentro del contexto de su proceso de prueba respectivo (System for MyTestMethod y 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestMethod2 se ejecuta como Restringido
  • MyTestSetup y MyTestCleanup se ejecutan como elevados para MyTestMethod y MyTestMethod2
  • MyClassSetup y MyClassCleanup se ejecutan como Default (en el mismo contexto que Te.exe se está ejecutando actualmente, pero dentro de un proceso diferente al de MyTestMethod y MyTestMethod2)
  • MyModuleSetup y MyModuleCleanup se ejecutan como System (dentro de un proceso diferente que 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestMethod2 se ejecuta como Restringido
  • MyTestSetup y MyTestCleanup se ejecutan dentro del mismo proceso que MyTestMethod y MyTestMethod2
  • MyClassSetup y MyClassCleanup se ejecutan como con privilegios elevados
  • MyModuleSetup y MyModuleCleanup se ejecutan como System (dentro de un proceso diferente que 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestMethod2 se ejecuta como Restringido
  • MyTestSetup y MyTestCleanup se ejecutan dentro del mismo proceso que MyTestMethod y en un proceso con privilegios elevados para MyTestMethod2
  • MyClassSetup y MyClassCleanup se ejecutan como elevados
  • MyModuleSetup y MyModuleCleanup se ejecutan como System (dentro de un proceso diferente al 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);
};

En el ejemplo anterior se ejecutarán pruebas y accesorios de la siguiente manera:

  • MyTestMethod se ejecuta como System
  • MyTestMethod2 se ejecuta como Restringido
  • MyTestSetup y MyTestCleanup se ejecutan como System (dentro de un proceso diferente al de MyTestMethod)
  • MyClassSetup y MyClassCleanup se ejecutan como elevados
  • MyModuleSetup y MyModuleCleanup se ejecutan como System (dentro de un proceso diferente al de MyTestMethod)