Partilhar via


Exemplo de teste controlado por dados de suporte para matriz

Esta seção aborda alguns recursos avançados do teste controlado por dados a título de exemplo. Se você ainda estiver abordando os conceitos básicos, convém começar com um exemplo controlado por dados simples.

Exemplos mencionados:

  • ArraySupportDataDrivenExample

  • CSharpDataDrivenArraySupportExample

As seções anteriores já abordaram os conceitos básicos de criação e execução de testes controlados por dados. A lista a seguir discute o significado de Matrizes no sentido de testes TAEF controlados por dados:

  • Matrizes são conjuntos de elementos de comprimento variável, tipo homogêneo que são tratados como um único parâmetro.
  • Para especificar um tipo de matriz, você precisa especificar explicitamente o tipo do parâmetro no bloco ParameterTypes e adicionar um atributo Array="true".

Os tipos de parâmetro com suporte estão listados em Tipos de parâmetro em Fontes de dados de tabela.

Se qualquer outro tipo de dado for especificado, o teste emitirá um aviso e o considerará como uma cadeia de caracteres. No caso de matrizes, o tipo de dado seria considerado do tipo String[].

O exemplo a seguir mostra como especificar que o parâmetro é uma matriz de um dos tipos básicos. É importante observar que não há tipos padrão permitidos no caso de matrizes. Você deve especificar explicitamente o tipo e definir o atributo Array para que o parâmetro seja true.

1  <?xml version="1.0"?>
2  <Data>
3    <Table Id="ArraySupportTable">
4      <ParameterTypes>
5        <ParameterType Name="Size" Array="true">int</ParameterType>
6        <ParameterType Name="Color" Array="true">String</ParameterType>
7      </ParameterTypes>
8      <Row>
9        <Parameter Name="Size">4</Parameter>
10       <Parameter Name="Color">White</Parameter>
11     </Row>
12     <Row>
13       <Parameter Name="Size">
14         <Value>4</Value>
15         <Value>6</Value>
16         <Value>8</Value>
17       </Parameter>
18       <Parameter Name="Color">
19         <Value>Red</Value>
20         <Value>Green</Value>
21         <Value>Blue</Value>
22       </Parameter>
23     </Row>
24     <Row>
25       <Parameter Name="Size">
26         <Value>9</Value>
27         <Value>12</Value>
28         <Value>16</Value>
29       </Parameter>
30       <Parameter Name="Color">Orange</Parameter>
31     </Row>
32     <Row>
33       <Parameter Name="Size">9</Parameter>
34       <Parameter Name="Color">
35         <Value>White</Value>
36         <Value>Black</Value>
37       </Parameter>
38     </Row>
39   </Table>
40 </Data>

Examine as tags Value e os atributos Matriz no exemplo acima. Primeiro, você deve especificar explicitamente o tipo dos parâmetros Size e Color e especificar se esses parâmetros são matrizes definindo o atributo Array como true. Em seguida, especifique os valores nas tags <Value>...</Value>. Você pode ter quantas tags <Value> forem necessárias para especificar qualquer número de valores dentro da matriz para um determinado parâmetro de linha.

Observe as linhas 9, 10, 30 e 33 nos exemplos de XML acima. Essas entradas são elementos de matriz de valor único. Em outras palavras, você pode especificar elementos de matriz de valor único diretamente na tag <Parameter> sem uma tag <Value> adicional. Além disso, mesmo que o parâmetro na linha tenha apenas um valor, ele ainda é tratado como uma matriz de um elemento e não pode ser recuperado de outra forma.

Agora, dê uma olhada nas APIs de recuperação.

Recuperação nativa

Os elementos de matriz podem ser recuperados em código nativo, usando a classe de modelo WEX::TestExecution::TestDataArray<>. Consulte o cabeçalho publicado TestData.h para obter detalhes. A classe TestDataArray gerencia a vida útil dos elementos da matriz e fornece APIs úteis para recuperar valores específicos dentro da matriz:

1  namespace WEX { namespace TestExecution
2  {
3      template <typename T>
4      class TECOMMON_API TestDataArray sealed
5      {
6         ...
7      public:
8          TestDataArray();
9          ~TestDataArray();
10         const size_t GetSize() const;
11         T& operator[](size_t index);
12
13     private:
14        ...
15     };
16 } /* namespace TestExecution */ } /* namespace WEX */

Você pode obter o comprimento da matriz chamando GetSize e pode obter um elemento específico usando o operador [].

O próximo exemplo mostra como usar essas funções no código. Considere o arquivo cpp no exemplo nativo:

1  TestDataArray<int> sizes;
2  if (SUCCEEDED(TestData::TryGetValue(L"size", sizes)))
3  {
4      size_t count = sizes.GetSize();
5      for (size_t i = 0; i < count; ++i)
6      {
7          Log::Comment(String().Format(L"Size[%d] retrieved was %d", i, sizes[i]));
8      }
9  }
10
11 TestDataArray<String> colors;
12 if (SUCCEEDED(TestData::TryGetValue(L"color", colors)))
13 {
14     size_t count = colors.GetSize();
15     for (size_t i = 0; i < count; ++i)
16     {
17         Log::Comment(String().Format(L"Color[%d] retrieved was ", i) + colors[i]);
18     }
19 }

Primeiro, você define um TestDataArray local do tipo de matriz. Nesse caso, sizes é uma matriz do tipo int e colors é uma matriz do tipo WEX::Common::String. A API para recuperar uma matriz é semelhante àquela que recupera qualquer variável. Você chama TestData::TryGetValue, pede para recuperar o parâmetro size e coloca o valor na variável local sizes.

Uma tentativa de recuperar um parâmetro especificado não matriz em uma matriz causa um erro e falha no teste. Da forma semelhante, uma tentativa de recuperar uma matriz em uma variável que não seja da matriz, mesmo que a matriz tenha apenas um elemento, causa um erro.

Se um parâmetro de matriz não for especificado na linha XML, uma tentativa de recuperar o parâmetro falhará. Por exemplo, se uma linha tiver a seguinte aparência:

       <Row>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

O parâmetro Size, que é uma matriz, não é especificado na linha. Se você tentar recuperar Size do código, a chamada de API retornará um código de retorno com falha. Você pode usá-lo para definir um valor de matriz padrão.

Por outro lado, você pode especificar uma matriz vazia especificando uma tag de parâmetro vazia para Size da seguinte maneira:

       <Row>
         <Parameter Name="Size"></Parameter>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

Nesse caso, uma tentativa de recuperar size seria bem-sucedida, mas o tamanho da matriz seria 0.

Recuperação gerenciada

A recuperação gerenciada permanece quase a mesma de antes. Você só precisa se certificar de recuperar os valores em uma variável local do tipo de matriz apropriado. Considere o seguinte exemplo gerenciado:

1  Int32[] sizes = m_testContext.DataRow["Size"] as Int32[];
2  foreach (int size in sizes)
3  {
4          Verify.AreNotEqual(size, 0);
5          Console.WriteLine("Size is " + size.ToString());
6  }
7
8  String[] colors = m_testContext.DataRow["Color"] as String[];
9  foreach (String color in colors)
10 {
11         Console.WriteLine("Color is " + color);
12 }

Semelhante à recuperação nativa, se um parâmetro de matriz não for especificado na linha XML, uma tentativa de recuperar o parâmetro retornará um objeto do tipo System.DBNull. Por exemplo, se uma linha tiver a seguinte aparência:

       <Row>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

O parâmetro Size, que é uma matriz, não é especificado na linha. Se você tentar recuperar Size do código, a chamada de API retornará um objeto do tipo DBNull. Se você tiver esses valores em sua tabela, convém recuperá-los do contexto em um objeto primeiro e executar as etapas apropriadas depois de comparar o tipo de objeto com typeof(System.DBNull) ou o tipo que você está esperando.

Por outro lado, você pode especificar uma matriz vazia especificando uma tag de parâmetro vazia para Size da seguinte maneira:

       <Row>
         <Parameter Name="Size"></Parameter>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

Nesse caso, uma tentativa de recuperar size com sucesso retorna uma matriz vazia do tipo System.Int32[].

Execução

A execução de testes controlados por dados que oferecem suporte a matrizes não é diferente da execução de qualquer outro teste controlado por dados. O único ponto chave de diferença é que a semântica dos critérios de seleção muda no caso de parâmetros de dados de matriz para significar "contém" em vez de "igual".

Para ver o que isso significa, imagine que você quer selecionar todos os testes controlados por dados em que a matriz Color contém o valor White. Para fazer isso, execute:

TE.exe Examples\CSharp.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
TE.exe Examples\CPP.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"

Esse comando executa os testes controlados por dados com índice 0 e 3 em ambos os casos acima.

Você pode criar consultas mais complexas que instruem, por exemplo, a selecionar apenas o teste no qual a matriz color contém white, e a matriz color contém black, que só selecionaria testes controlados por dados com índice 3. Como exercício, tente escrever e executar essa consulta você mesmo.