Partilhar via


Aproveitando ao máximo o TAEF

A Estrutura de Criação e Execução de Teste fornece uma plataforma poderosa para criar e executar seus testes. Pode ser benéfico entender alguns detalhes funcionando nos bastidores do TAEF para aproveitar ao máximo. Esta página discute algumas dicas e recursos que ajudarão você a criar seus testes para otimizar e aproveitar ao máximo o que o TAEF tem a oferecer. Verifique se você está familiarizado com os conceitos básicos de Criação e Execução de testes com TAEF.

Métodos de configuração (ou inicialização) e limpeza

Os métodos de instalação e limpeza no nível do assembly (também conhecidos como acessórios), são executados uma vez por execução de DLL. Da mesma forma, os métodos de instalação e limpeza de nível de classe são executados uma vez por classe. Os métodos de configuração e limpeza de nível de teste são os mesmos para todos os testes em uma classe e são invocados uma vez antes e depois de cada teste na classe .

Pode haver apenas um método de instalação e limpeza de nível de assembly por assembly, um método de instalação e limpeza de nível de classe por classe e um método de instalação e limpeza de teste por classe. Observe que os métodos de instalação e limpeza de classe são estáticos no código gerenciado, mas não são estáticos no código C++.

Se as exceções estiverem habilitadas (o caso padrão), a execução de qualquer método será encerrada na primeira chamada Verificar que falha. Se você tiver desabilitado explicitamente as chamadas De verificação baseadas em exceção (consulte a seção Verificar em Testes de Criação para obter detalhes), precisará ter instruções condicionais explícitas para controlar o fluxo de controle depois que uma chamada Verify falhar.

No caso em que a falha ocorre em um método de Instalação (por meio de falha de verificação baseada em exceção ou por configuração retornando explicitamente uma falha), os testes a seguir são considerados "Bloqueados" e registrados como tal. Por exemplo, se o método de instalação de nível de classe falhar, todos os métodos de teste na Classe serão considerados "Bloqueados" e cada um deles será registrado como tal. Além disso, o método Cleanup não será invocado se a falha ocorrer em um método de Instalação.

Método test

Não é necessário registrar explicitamente o resultado do teste. Se todas as chamadas De verificação no teste forem bem-sucedidas, o teste será registrado como "Aprovado". Na primeira chamada Verificar que falha, a execução do método de teste será encerrada (a menos que você tenha desabilitado explicitamente as chamadas verify baseadas em exceção – nesse caso, suas instruções condicionais determinarão o fluxo de controle lá depois, mas independentemente das retenções a seguir) e o teste será marcado como "Falha".

Da mesma forma, se você tiver um wrapper VERIFY (depende do tipo de retorno e do que determina o êxito) em torno de uma chamada de invocação de método auxiliar, você não precisará marcar explicitamente e registrar seu resultado.

Especificando metadados

A pesquisa de metadados é hierárquica. Isso significa que se a instrução select for /select:"@Priority=2" e se o TestMethod não especificar Prioridade, o TAEF examinará a classe que a contém. Se os metadados de nível de classe não o especificarem, o TAEF examinará o nível do assembly.

Portanto, se você quiser que todos ou a maioria dos testes em sua classe tenham a mesma "Prioridade" ou diga "Proprietário, você pode obter isso apenas especificando-o no nível da classe. Para um ou poucos testes que são uma exceção a essa regra, você pode fornecer explicitamente os metadados no nível "TestMethod". Consulte o teste a seguir para obter detalhes:

1    namespace WEX { namespace UnitTests { namespace Samples
2    {
3        //
4        // Declare module level properties
5        //
6        BEGIN_MODULE() //This metadata applies to all the classes and tests in this module or assembly
7            MODULE_PROPERTY(L"GroupOwner", L"SomeGroup")
8        END_MODULE()
9        class PremiumBankAccountTests
10       {
11           //
12           // Declare this class to be a test class with an'advanced' declaration
13           // Use advanced declaration when you want to set metadata on the class
14           //
15           BEGIN_TEST_CLASS(PremiumBankAccountTests) //This metadata applies to all the test in this class
16               TEST_CLASS_PROPERTY(L"Priority", L"2")
17               TEST_CLASS_PROPERTY(L"DevOwner", L"Someone")
18               TEST_CLASS_PROPERTY(L"PMOwner", L"Someone")
19           END_TEST_CLASS()
20           //
21           // Declare class setup - a method that runs after class constructor
22           // and before any test class methods and test setup method
23           //
24           TEST_CLASS_SETUP(SetDefaultAccountType);
25           //
26           // Declare class cleanup - a methods that runs after all the class test methods and test setup method
27           // and before the class destructor
28           //
29           TEST_CLASS_CLEANUP(ResetDefaultAccountType);
30           //
31           // Declare test setup and cleanup - methods that run before and after the execution
32           // of every test method correspondingly
33           //
34           TEST_METHOD_SETUP(CreateBankAccount);
35           TEST_METHOD_CLEANUP(DestroyBankAccount);
36           //
37           // Declare test methods with an 'advanced' declaration
38           // Use advanced declaration when you want to set metadata on the methods
39           //
40           BEGIN_TEST_METHOD(DebitTest)
41               TEST_METHOD_PROPERTY(L"BVT", L"TRUE")
42               TEST_METHOD_PROPERTY(L"PERF", L"TRUE")
43               TEST_METHOD_PROPERTY(L"STRESS", L"FALSE")
44               TEST_METHOD_PROPERTY(L"Priority", L"1") //Overrides the Class level Priority value
45           END_TEST_METHOD()
46           BEGIN_TEST_METHOD(CreditTest)
47               TEST_METHOD_PROPERTY(L"BVT", L"TRUE")
48               TEST_METHOD_PROPERTY(L"PERF", L"FALSE")
49               TEST_METHOD_PROPERTY(L"STRESS", L"TRUE")
50               TEST_METHOD_PROPERTY(L"GroupOwner", L"SomeGroupTest") //Overrides the GroupOwner specified at the Module level
51           END_TEST_METHOD()
52   
53           std::unique_ptr<BankAccount> m_spBankAccount;
54           BankAccountType m_defaultType;
55       };
56   } /* namespace Samples */ } /* namespace UnitTests */ } /* namespace WEX */

OBSERVAÇÃO: para testes gerenciados, a criação é feita da mesma forma. O nível do módulo é o mesmo que a marcação no nível do assembly no gerenciado. Para a especificação de metadados de nível de assembly ou de nível de classe no código gerenciado, a marcação deve ser fornecida antes dos métodos inicializadores estáticos. Isso pode significar que talvez você precise fornecer um Inicializador vazio se o teste ainda não tiver um. Esse design é criado especificamente para garantir a compatibilidade do VSTS.

No caso de testes baseados em dados baseados em tabela, você pode levar isso adiante e substituir os metadados de nível de teste especificando-os no nível linha. Consulte Exemplo de teste orientado a dados de substituição de metadados para obter detalhes.