Partilhar via


RunFixtureAs

O TAEF usa RunFixtureAs para executar equipamentos de teste (funções de configuração e limpeza de módulo, classe e nível de teste) em um contexto diferente do(s) teste(s) correspondente(s).

Pré-requisitos

  • O Te.Service deve estar instalado e em execução na máquina para executar conjuntos de testes elevados a partir de um processo Te.exe não elevado ou para executar conjuntos de testes como Sistema Local.

Visão geral

RunFixtureAs pode ser aplicado no nível de módulo, classe e/ou teste e será herdado na árvore de teste. Para possibilitar a capacidade de desativar a herança de RunFixtureAs a um dado nível na árvore, também são suportados os metadados RunFixtureAs:[scope].

Por exemplo, se um módulo estiver marcado com RunFixtureAs=System, uma classe (ClassA) pode ser marcada como RunFixtureAs:Test=Default. Nesse caso, os equipamentos de módulo e classe serão executados como Sistema, mas os equipamentos de nível de teste dentro da Classe A serão executados 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 âmbito especificado.

Garantias determinísticas

  • Por padrão (se nenhum valor de RunFixtureAs for especificado), é garantido que testes e fixações sejam executados dentro do mesmo processo.
  • Se uma luminária estiver marcada com um valor RunFixtureAs válido diferente de 'Test', a luminária será executada em um processo diferente do teste. Isso significa que, mesmo que um teste esteja marcado com RunAs=Elevated e RunFixtureAs=Elevated, o teste será executado em um processo elevado e seus equipamentos serão executados em um processo elevado separado.
  • Os pares de configurações correspondentes para um determinado âmbito serão sempre executados dentro do mesmo processo (por exemplo, a configuração e as rotinas de limpeza de uma classe serão executadas dentro do mesmo processo).

RunFixtureAs tipos

O TAEF suporta os seguintes tipos RunFixtureAs, que são especificados pelos metadados de teste:

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

Observação Os dispositivos de teste que você executa como Sistema Local não devem criar nenhuma interface do usuário. Se seus equipamentos precisam criar ou interagir com a interface do usuário, você precisa mover o código relacionado à interface do usuário para executáveis separados que são iniciados em uma área de trabalho a partir de seus testes usando CreateProcessAsUser.

Elevado
O TAEF garante que a fixação é executada em um processo elevado, gerando um processo elevado no qual a fixação deve ser executada, se necessário.

Observação O usuário que executa o TAEF deve ser membro do grupo de administradores para executar equipamentos marcados com RunFixtureAs=Elevated. Isso se deve ao fato de que os não-administradores não têm um token dividido para elevar.

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

Corretor
A TAEF executa a configuração em um processo de 'Immersive Broker'.

Nota  

  • 'Broker' só é suportado no Windows 8 e sistemas operativos superiores.
  • A política de assinatura de teste deve estar ativada no sistema. Para obter mais informações, a opção de configuração de inicialização TESTSIGNING.
  • A execução remota de testes com 'RunFixtureAs=Broker' não é suportada no momento.
  • Ao executar com 'RunFixtureAs=Broker', o TAEF usará o processo "TE.ProcessHost.Broker.exe" para a execução do fixture, não "TE.ProcessHost.exe".

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

Nota  

  • UIAccess só é suportado no Vista e sistemas operacionais superiores.
  • Os binários TAEF devem estar sendo executados a partir de uma pasta na pasta Arquivos de Programas no computador.
  • A execução remota de testes com 'RunFixtureAs=UIAccess' não é suportada atualmente.
  • Ao executar com 'RunFixtureAs=UIAccess', o TAEF utilizará o processo "TE.ProcessHost.UIAccess.exe" para a execução do teste, e não "TE.ProcessHost.exe".

Teste
O TAEF executa o equipamento no mesmo processo ou contexto que o teste.

Observação Este é o comportamento TAEF padrão quando nenhuma configuração RunFixtureAs é especificada.

RunFixtureAs:[âmbito]

O TAEF suporta os 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 Module 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.

Testes de marcação 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 de teste da seguinte maneira:

  • MyTestMethod é executado como System
  • MyTestSetup e MyTestCleanup são executados como Elevado
  • MyClassSetup e MyClassCleanup são executados como System (dentro do 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 configurações de teste da seguinte forma:

  • MyTestMethod é executado como System
  • MyTestSetup e MyTestCleanup são executados como Elevado
  • MyClassSetup e MyClassCleanup são executados como Elevado
  • 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 configurações da seguinte maneira:

  • MyTestMethod é executado como Restricted
  • MyTestSetup e MyTestCleanup são executados como Elevado
  • MyClassSetup e MyClassCleanup são executados como System
  • MyModuleSetup e MyModuleCleanup são executados como Restricted (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 System
  • MyTestMethod2 é executado como restrito
  • MyTestSetup e MyTestCleanup são executados como Elevated; o escopo RunFixtureAs:Test aplicado a todos os métodos de teste dentro da classe MyTests
  • MyClassSetup e MyClassCleanup são executados como System (dentro de um processo diferente de MyTestMethod)
  • MyModuleSetup e MyModuleCleanup são executados no contexto do seu respetivo processo 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 fixações da seguinte maneira:

  • MyTestMethod é executado como System
  • MyTestMethod2 é executado como restrito
  • MyTestSetup e MyTestCleanup são executados como System para MyTestMethod e como Elevated para MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como System (dentro de um processo diferente de MyTestMethod)
  • MyModuleSetup e MyModuleCleanup são executados no contexto de seu respetivo processo de teste (no contexto '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 preparações da seguinte forma:

  • MyTestMethod é executado como System
  • MyTestMethod2 é executado como restrito
  • MyTestSetup e MyTestCleanup são executados como Elevated para MyTestMethod e MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como padrão (dentro do mesmo contexto em que Te.exe está sendo executado atualmente, mas dentro de um processo diferente de MyTestMethod e MyTestMethod2)
  • MyModuleSetup e MyModuleCleanup são executados como System (dentro de um processo diferente 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);
};

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

  • MyTestMethod é executado como System
  • MyTestMethod2 é executado como restrito
  • MyTestSetup e MyTestCleanup são executados dentro do mesmo processo que MyTestMethod e MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como Elevado
  • MyModuleSetup e MyModuleCleanup são executados como System (dentro de um processo diferente 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);
};

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

  • MyTestMethod é executado como System
  • MyTestMethod2 é executado como restrito
  • MyTestSetup e MyTestCleanup são executados dentro do mesmo processo que MyTestMethod e em um processo elevado para MyTestMethod2
  • MyClassSetup e MyClassCleanup são executados como Elevado
  • MyModuleSetup e MyModuleCleanup são executados como System (dentro de um processo diferente 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);
};

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

  • MyTestMethod é executado como System
  • MyTestMethod2 é executado como restrito
  • MyTestSetup e MyTestCleanup são executados como System (dentro de um processo diferente de MyTestMethod)
  • MyClassSetup e MyClassCleanup são executados como Elevado
  • MyModuleSetup e MyModuleCleanup são executados como System (dentro de um processo diferente de MyTestMethod)