Compartilhar via


Testes leves orientados por dados

É provável que haja cenários em que um teste controlado por dados baseado em tabela e fonte de dados XML completo pode ser muito pesado para suas necessidades de cenário de teste. O teste leve orientado por dados permite uma maneira rápida e fácil de obter suporte a testes orientados por dados quando os dados para seu teste são simples e podem ser facilmente expressos como metadados. Vamos usar um exemplo e ver como.

Os dados para o teste orientado por dados leves são expressos como um conjunto de metadados (no nível de teste, classe ou módulo). Para cada um dos valores neste conjunto, os métodos de teste em questão, juntamente com os métodos de configuração e desmontagem associados serão executados para cada valor no conjunto. Vamos dar uma olhada em como criar isso em código nativo:

1  #include "WexString.h"
2  #include "WexTestClass.h"
3
4  using namespace WEX::Common;
5  using namespace WEX::TestExecution;
6  using namespace WEX::Logging;

7  namespace WEX { namespace TestExecution { namespace Examples
8  {
9      class SimpleDataDrivenExample
10     {
11         TEST_CLASS(SimpleDataDrivenExample);
12         ...
13         BEGIN_TEST_METHOD(SetsOfDataTest)
14             TEST_METHOD_PROPERTY(L"Data:Color", L"{Purple, Maroon, Brown}")
15         END_TEST_METHOD()
16     };

Observe os valores de parâmetro para TEST_METHOD_PROPERTY na linha 14. O valor de metadados de teste começa com um "{" e termina com um "}" indicando que uma lista separada por vírgula ou ponto-e-vírgula de valores foi especificada. O TAEF executará novamente o método de teste em questão, SetsOfDataTest() uma vez para cada valor neste conjunto.

Observe também que o nome dos metadados começa com um "Data:". Isso implica que o conjunto de metadados está realmente especificando variações para os parâmetros de teste controlados por dados e estaria disponível para o método de teste real da mesma forma que os parâmetros de dados de um teste controlado por dados baseado em tabela assim:

11     ...
12
13     void SimpleDataDrivenExample::SetsOfDataTest()
14     {
15         String color;
16         if (SUCCEEDED(TestData::TryGetValue(L"color", color)))
17         {
18             Log::Comment(L"Color retrieved was " + color);
19         }
20     }
21 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

Ao trabalhar com código gerenciado, a especificação e a recuperação do conjunto de dados são muito parecidas com o exemplo nativo. Vamos dar uma olhada:

1  namespace WEX.Examples
2  {
3      using Microsoft.VisualStudio.TestTools.UnitTesting;
4      using System;
5      using System.Collections;
6      using System.Data;
7      using WEX.Logging.Interop;
8      using WEX.TestExecution;
9
10     [TestClass]
11     public class CSharpDataDrivenSimpleExample
12     {
13         ...
14         [TestMethod]
15         [TestProperty("Data:Color", "{Red, Green, Blue}")]
16         public void SetsOfMetadataTest()
17         {
18             Log.Comment("Color is " + m_testContext.DataRow["Color"]);
19         }
20
21         public TestContext TestContext
22         {
23             get { return m_testContext; }
24             set { m_testContext = value; }
25         }
26
27         private TestContext m_testContext;
28     }
29 }

Assim como no caso de testes controlados por dados baseados em tabela, conjuntos de dados especificados como metadados permitirão a recuperação via TestContext.DataRow.Observe que, para manter o teste controlado por dados leve, o tipo de parâmetro sempre será WEX::Common::String (em código nativo) e String(em código gerenciado)

Se vários valores de dados forem especificados, um produto cartesiano de todos os valores possíveis será obtido e o método de teste será chamado para cada combinação.

Além disso, é possível ter alguns conjuntos de metadados (como conjuntos de metadados ThreadingModel), bem como conjuntos de dados especificados para o mesmo método de teste. Nesse caso, uma expansão combinatória de todos os conjuntos de metadados e conjuntos de dados será produzida pelo TAEF e os métodos de teste em questão serão invocados a cada combinação.

Casos especiais - teste orientado a dados com um conjunto de metadados ou dados

Você pode ter um método de teste dependente do teste controlado por dados baseado em tabela, bem como especificar um conjunto de dados ou metadados para ele. Por exemplo, um método de teste pode ter os parâmetros "tamanho" e "cor" especificados no teste controlado por dados baseado em tabela e desejar que todas as linhas sejam executadas uma vez com o parâmetro "transparência" definido como true e, em seguida, definido como false. Nesse caso, "transparência" poderia ser especificada como um conjunto "{true, false}" para o teste controlado por dados. É importante observar que, em caso de conflitos de parâmetro em uma linha controlada por dados baseada em tabela de versos de conjunto de metadados, o tipo e o valor do parâmetro Nível de linha substituirão o valor do conjunto de metadados.

Executando testes com Conjuntos de dados / metadados

A execução de testes contendo conjuntos de dados é bastante intuitiva. Vamos dar uma olhada na saída /listproperties para nossos testes de exemplo:

1   te Examples\CPP.DataDriven.Example.dll /name:*SetsOfDataTest* /listproperties
2
3   Test Authoring and Execution Framework v2.9.3k for x64
4
5           f:\ Examples\CPP.SimpleDataDriven.Example.dll
6               WEX::TestExecution::Examples::SimpleDataDrivenExample<
7                   WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet0
8                           Property[Data:Color] = {Purple, Maroon, Brown}
9
10                          Data[Color] = Purple
11
12                  WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet1
13                          Property[Data:Color] = {Purple, Maroon, Brown}
14
15                          Data[Color] = Maroon
16
17                  WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet2
18                          Property[Data:Color] = {Purple, Maroon, Brown}
19
20                          Data[Color] = Brown

Observe as linhas 7, 12 e 17 no exemplo acima. Um índice de conjunto de metadados é acrescentado a cada invocação do método de teste com o valor no conjunto de dados. Este índice é da forma:

<namespace qualified test method name>#metadataSet<metadataIndex>

As linhas 8, 13 e 18 mostram o conjunto de metadados que foi especificado para esse suporte de teste controlado por dados leve. Neste caso o conjunto é composto pelas cores roxo, marrom e marrom. As linhas 10, 15 e 20 mostram o valor real desse conjunto que está ativo para a invocação atual do teste. No caso de SetsOfMetadataTest#metadataSet1, a segunda invocação desse método, o valor do parâmetro ativo do conjunto é "Maroon"

Você pode selecionar o valor ou o nome de dados da mesma forma que faria em testes controlados por dados baseados em tabela. Por exemplo, você pode selecionar SetsOfDataTest#metadataSet1 por uma consulta de seleção como /select:@Data:Color='Maroon' ou /name:*#metadataSet1

Para referência rápida, a saída /listproperties do exemplo de teste manged é mostrada abaixo:

te Examples\CSharp.DataDriven.Example.dll /name:*SetsOfMetadataTest* /listproperties

Test Authoring and Execution Framework v2.9.3k for x64

        f:\ Examples\CSharp.DataDrivenSimple.Example.dll
            WEX.Examples.CSharpDataDrivenSimpleExample
                WEX.Examples.CSharpDataDrivenSimpleExample.NonDataDrivenTest
                WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet0
                        Property[Data:Color] = {Red, Green, Blue}

                        Data[Color] = Red

                WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet1
                        Property[Data:Color] = {Red, Green, Blue}

                        Data[Color] = Green

                WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet2
                        Property[Data:Color] = {Red, Green, Blue}

                        Data[Color] = Blue