Compartilhar via


RunFixtureAs

O TAEF usa RunFixtureAs para executar dispositivos de teste (módulo, classe e funções de instalação e limpeza no nível de teste) em um contexto diferente dos testes correspondentes.

Pré-requisitos

  • O Te.Service deve ser instalado e em execução no computador para executar dispositivos de teste elevados de um processo de Te.exe não elevado ou para executar dispositivos de teste como Sistema Local.

Visão geral do

RunFixtureAs pode ser aplicado no módulo, classe ou nível de teste e será herdado pela árvore de teste. Para dar suporte à capacidade de recusar a herança RunFixtureAs em um determinado nível na árvore, também há suporte para metadados RunFixtureAs:[scope].

Por exemplo, se um módulo for marcado com RunFixtureAs=System, uma classe (ClassA) poderá ser marcada como RunFixtureAs:Test=Default. Nesse caso, as fixtures de módulo e classe serão executadas como Sistema, mas as fixtures de nível de teste dentro da ClassA serão executadas no mesmo contexto que Te.exe (embora ainda em um processo diferente do teste).

O valor de metadados RunFixtureAs:[scope] não é herdado na árvore de teste; aplica-se apenas ao escopo especificado.

Garantias determinísticas

  • Por padrão (se nenhum valor RunFixtureAs for especificado), testes e estruturas serão executados no mesmo processo.
  • Se um componente for marcado com um valor RunFixtureAs válido diferente de 'Test', o componente será executado em um processo diferente do teste. Isso significa que, mesmo que um teste seja marcado com RunAs=Elevated e RunFixtureAs=Elevated, o teste será executado em um processo elevado, e suas fixações serão executadas em um processo elevado separado.
  • Os pares de instalação correspondentes para um determinado escopo sempre serão executados no mesmo processo (por exemplo, os acessórios de instalação e limpeza de uma classe serão executados no mesmo processo).

Tipos RunFixtureAs

O TAEF dá suporte aos seguintes tipos RunFixtureAs, que são especificados pelos metadados de teste:

Sistema
O TAEF executa a instalação como Sistema Local.

Nota As fixações de teste executadas como o Sistema Local não devem criar nenhuma interface de usuário. Se seus dispositivos precisarem criar ou interagir com a interface do usuário, você precisará mover seu código relacionado à interface do usuário para executáveis separados que são executados em um ambiente de desktop a partir dos seus testes usando CreateProcessAsUser.

Elevado
O TAEF garante que a luminária seja executada em um processo elevado gerando um processo elevado no qual executar a instalação, se necessário.

Nota O usuário que executa o TAEF deve ser membro do grupo de administradores para executar as estruturas marcadas com RunFixtureAs=Elevated. Isso ocorre devido ao fato de que os não administradores não têm um token dividido para elevar.

Padrão
O TAEF executa a instalação no mesmo contexto que Te.exe (mas ainda dentro de um processo diferente do teste).

Broker
O TAEF executa a instalação em um processo de 'Agente Imersivo'.

Nota  

  • O 'Broker' só tem suporte em sistemas operacionais Windows 8 e superiores.
  • A política de assinatura de teste deve ser habilitada no sistema. Para obter mais informações, a opção de configuração de inicialização TESTSIGNING.
  • No momento, não há suporte para a execução remota de testes com 'RunFixtureAs=Broker'.
  • Quando executar com 'RunFixtureAs=Broker', o TAEF usará o processo "TE.ProcessHost.Broker.exe" para execução do fixture, não "TE.ProcessHost.exe".

UIAccess
O TAEF executa a instalação em um processo marcado com o nível de execução UIAccess. Para obter informações sobre UIAccess para aplicativos de automação de interface do usuário, consulte o Design do Mecanismo de Integridade do Windows.

Nota  

  • O UIAccess só tem suporte no Vista e em sistemas operacionais mais altos.
  • Os binários TAEF devem estar em execução em uma pasta na pasta Arquivos de Programas no computador.
  • No momento, não há suporte para a execução remota de testes com 'RunFixtureAs=UIAccess'.
  • Ao executar com 'RunFixtureAs=UIAccess', o TAEF usará o processo "TE.ProcessHost.UIAccess.exe" para a execução do fixture, ao invés do "TE.ProcessHost.exe".

Teste
O TAEF executa a instalação no mesmo processo ou contexto que o teste.

Nota Esse é o comportamento taef padrão quando nenhuma configuração de RunFixtureAs é especificada.

RunFixtureAs:[scope]

O TAEF dá suporte aos seguintes valores RunFixtureAs:[scope], que são especificados pelos metadados de teste.

RunFixtureAs:Module, RunFixtureAs:Assembly ou RunFixtureAs:Dll
O valor RunFixtureAs será aplicado somente ao nó de nível do módulo na hierarquia de teste.

RunFixtureAs:Class
O valor RunFixtureAs será aplicado somente aos nós de nível de classe na hierarquia de teste.

RunFixtureAs:Method ou RunFixtureAs:Test
O valor RunFixtureAs será aplicado somente aos nós de nível de teste na hierarquia de teste.

Marcando testes com 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);
};

O exemplo anterior executará testes e configurações da seguinte maneira:

  • MyTestMethod é executado como Sistema
  • MyTestSetup e MyTestCleanup são executados como Elevated
  • MyClassSetup e MyClassCleanup são executados como Sistema (no mesmo processo que MyTestMethod)
  • MyModuleSetup e MyModuleCleanup são executados como System (dentro do mesmo processo 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);
};

O exemplo anterior executará testes e instalações da seguinte maneira:

  • MyTestMethod é executado como Sistema
  • MyTestSetup e MyTestCleanup são executados como Elevated
  • MyClassSetup e MyClassCleanup são executados como Elevated
  • MyModuleSetup e MyModuleCleanup são executados como System (dentro do mesmo processo 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);
};

O exemplo anterior executará testes e acessórios da seguinte maneira:

  • MyTestMethod é executado com permissões restritas
  • MyTestSetup e MyTestCleanup são executados como Elevated
  • MyClassSetup e MyClassCleanup são executados como Sistema
  • MyModuleSetup e MyModuleCleanup são executados como Restrito (dentro do mesmo processo 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);
};

O exemplo anterior executará testes e fixtures da seguinte maneira:

  • MyTestMethod é executado como Sistema
  • MyTestMethod2 é executado em Modo Restrito
  • MyTestSetup e MyTestCleanup são executados como Elevated; o escopo RunFixtureAs:Test aplicado a todos os métodos de teste na classe MyTests
  • MyClassSetup e MyClassCleanup são executados como Sistema (em um processo diferente do MyTestMethod)
  • MyModuleSetup e MyModuleCleanup são executados como dentro do contexto de seus respectivos processos de teste ("System" para MyTestMethod e "Restricted" para 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);
};

O exemplo anterior executará testes e acessórios da seguinte maneira:

  • MyTestMethod é executado como Sistema
  • MyTestMethod2 é executado em Modo Restrito
  • MyTestSetup e MyTestCleanup são executados como System for MyTestMethod e como Elevated for MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como Sistema (em um processo diferente do MyTestMethod)
  • MyModuleSetup e MyModuleCleanup são executados no contexto de seus respectivos processos de teste (System para MyTestMethod e Restricted para 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);
};

O exemplo anterior executará testes e elementos de teste da seguinte maneira:

  • MyTestMethod é executado como Sistema
  • MyTestMethod2 é executado em Modo Restrito
  • MyTestSetup e MyTestCleanup são executados como Elevados para MyTestMethod e MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como Padrão (no mesmo contexto que Te.exe está em execução no momento, mas em um processo diferente de MyTestMethod e MyTestMethod2)
  • MyModuleSetup e MyModuleCleanup são executados como Sistema (em um processo diferente do 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);
};

O exemplo anterior executará testes e configurações da seguinte maneira:

  • MyTestMethod é executado como Sistema
  • MyTestMethod2 é executado em Modo Restrito
  • MyTestSetup e MyTestCleanup são executados no mesmo processo que MyTestMethod e MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como Elevated
  • MyModuleSetup e MyModuleCleanup são executados como Sistema (em um processo diferente do 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);
};

O exemplo anterior executará testes e configurações de teste da seguinte maneira:

  • MyTestMethod é executado como Sistema
  • MyTestMethod2 é executado em Modo Restrito
  • MyTestSetup e MyTestCleanup são executados no mesmo processo que MyTestMethod e em um processo Elevado para MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como Elevated
  • MyModuleSetup e MyModuleCleanup são executados como Sistema (em um processo diferente do 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);
};

O exemplo acima executará testes e configurações da seguinte forma:

  • MyTestMethod é executado como Sistema
  • MyTestMethod2 é executado em Modo Restrito
  • MyTestSetup e MyTestCleanup são executados como Sistema (em um processo diferente do MyTestMethod)
  • MyClassSetup e MyClassCleanup são executados como Elevated
  • MyModuleSetup e MyModuleCleanup são executados como Sistema (em um processo diferente do MyTestMethod)