RunFixtureAs
O TAEF usa RunFixtureAs para executar acessórios 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 acessórios de teste elevados de um processo de Te.exe não elevado ou executar acessórios de teste como Sistema Local.
Visão geral
RunFixtureAs pode ser aplicado no módulo, classe e ou nível de teste e será herdado na á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, os acessórios de módulo e classe serão executados como Sistema, mas os acessórios 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 escopo especificado.
Garantias determinísticas
- Por padrão (se nenhum valor RunFixtureAs for especificado), os testes e os acessórios serão executados no mesmo processo.
- Se um acessório for marcado com um valor RunFixtureAs válido diferente de 'Test', o acessório 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 seus acessórios serão executados em um processo elevado separado.
- Os pares de acessórios correspondentes para um determinado escopo sempre serão executados dentro do 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 o acessório como Sistema Local.
Nota Os acessórios de teste executados como Sistema Local não devem criar nenhuma interface do usuário. Se seus acessórios 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 iniciados em uma área de trabalho de seus testes usando CreateProcessAsUser.
Elevado
O TAEF garante que o acessório seja executado em um processo elevado gerando um processo elevado no qual executar o acessório, se necessário.
Nota O usuário que executa o TAEF deve ser membro do grupo de administradores para executar acessórios marcados 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 o acessório no mesmo contexto que Te.exe (mas ainda dentro de um processo diferente do teste).
Corretor
O TAEF executa o acessório em um processo de 'Agente Imersivo'.
Observação
- 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 de testes remotamente com 'RunFixtureAs=Broker'.
- Ao executar com o TAEF "RunFixtureAs=Broker", o TAEF usará o processo "TE.ProcessHost.Broker.exe" para execução do acessório, não "TE.ProcessHost.exe".
Uiaccess
O TAEF executa o acessório 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 Design do Mecanismo de Integridade do Windows.
Observação
- O UIAccess só tem suporte no Vista e em sistemas operacionais superiores.
- 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 de testes remotamente com 'RunFixtureAs=UIAccess'.
- Ao executar com 'RunFixtureAs=UIAccess', o TAEF usará o processo "TE.ProcessHost.UIAccess.exe" para execução do acessório, não "TE.ProcessHost.exe".
Teste
O TAEF executa o acessório no mesmo processo ou contexto que o teste.
Nota Esse é o comportamento padrão do TAEF 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ó 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 acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestSetup e MyTestCleanup são executados como Elevados
- MyClassSetup e MyClassCleanup são executados como Sistema (dentro do mesmo processo que MyTestMethod)
- MyModuleSetup e MyModuleCleanup são executados como Sistema (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 acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestSetup e MyTestCleanup são executados como Elevados
- MyClassSetup e MyClassCleanup são executados como Elevados
- MyModuleSetup e MyModuleCleanup são executados como Sistema (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 como Restrito
- MyTestSetup e MyTestCleanup são executados como Elevados
- MyClassSetup e MyClassCleanup são executados como Sistema
- MyModuleSetup e MyModuleCleanup são executados como Restritos (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 acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestMethod2 é executado como Restrito
- MyTestSetup e MyTestCleanup são executados como Elevados; 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 de MyTestMethod)
- MyModuleSetup e MyModuleCleanup são executados no contexto de seu respectivo processo de teste (System for MyTestMethod e 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);
};
O exemplo anterior executará testes e acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestMethod2 é executado como 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 de MyTestMethod)
- MyModuleSetup e MyModuleCleanup são executados no contexto de seu respectivo processo de teste (System for MyTestMethod e 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);
};
O exemplo anterior executará testes e acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestMethod2 é executado como Restrito
- MyTestSetup e MyTestCleanup são executados como Elevados para MyTestMethod e MyTestMethod2
- MyClassSetup e MyClassCleanup são executados como Padrão (dentro do 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 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 acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestMethod2 é executado como Restrito
- MyTestSetup e MyTestCleanup são executados no mesmo processo que MyTestMethod e MyTestMethod2
- MyClassSetup e MyClassCleanup são executados como Elevados
- MyModuleSetup e MyModuleCleanup são executados como Sistema (em 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 acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestMethod2 é executado como 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 Elevados
- MyModuleSetup e MyModuleCleanup são executados como Sistema (em 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 acessórios da seguinte maneira:
- MyTestMethod é executado como Sistema
- MyTestMethod2 é executado como Restrito
- MyTestSetup e MyTestCleanup são executados como Sistema (em um processo diferente de MyTestMethod)
- MyClassSetup e MyClassCleanup são executados como Elevados
- MyModuleSetup e MyModuleCleanup são executados como Sistema (em um processo diferente de MyTestMethod)