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.