Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Esta seção aborda alguns recursos avançados de testes orientados por dados a título de exemplo. Se você ainda estiver cobrindo o básico, convém começar com um exemplo Simple Data Driven.
Exemplos referenciados:
ArraySupportDataDrivenExample
CSharpDataDrivenArraySupportExample
As seções anteriores já abordaram os conceitos básicos de criação e execução de testes orientados por dados. A lista a seguir discute o significado de Arrays no sentido de TAEF Data Driven Testing:
- Matrizes são comprimento variável, tipo homogêneo conjunto de elementos 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âmetros suportados estão listados em Parameter Types in Table Data Sources.
Se qualquer outro tipo de dados for especificado, o teste lançará um aviso e o considerará como uma String. No caso de matrizes, o tipo de dados 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 notar 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 Array no exemplo acima. Primeiro, você deve especificar explicitamente o tipo para os parâmetros Size e Color e especificar que esses parâmetros são matrizes, definindo o atributo Array como true. Em seguida, especifique os valores em <Value>tags ...</Value> tags. Você pode ter quantas tags <Value> precisar para especificar qualquer número de valores dentro da matriz para um determinado parâmetro Row.
Observe as linhas 9, 10, 30 e 33 nos exemplos 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 adicional <Value>. 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 o WEX::TestExecution::TestDataArray<> classe de modelo. Consulte o cabeçalho publicado TestData.h para obter detalhes. A classe TestDataArray gerencia o tempo de vida 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, tamanhos é uma matriz do tipo int e cores é 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-lhe para recuperar o parâmetro tamanhoe coloca o valor na variável local tamanhos.
Observe que uma tentativa de recuperar um parâmetro especificado não matriz em uma matriz causa um erro e falha no teste. Da mesma forma, uma tentativa de recuperar uma matriz em uma variável não-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 se parecesse com:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Observe que o parâmetro Tamanho, que é uma matriz, não é especificado na linha. Se você tentar recuperar Tamanho do código, a chamada de API retornará um código de retorno com falha. Você pode usar isso para definir um valor de matriz padrão.
Por outro lado, você pode especificar uma matriz vazia especificando uma marca de parâmetro vazia para Tamanho 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 tamanho seria bem-sucedida, mas o tamanho da matriz seria 0.
recuperação gerenciada
A recuperação gerenciada permanece quase a mesma de antes - apenas você 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 se parecesse com:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Observe que o parâmetro Tamanho, que é uma matriz, não é especificado na linha. Se você tentar recuperar Tamanho 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 tipo de (System.DBNull) ou o tipo que você está exepecando que seja.
Por outro lado, você pode especificar uma matriz vazia especificando uma marca de parâmetro vazia para Tamanho 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 tamanho succeessfully retorna uma matriz vazia do tipo System.Int32[].
Execução
Executar testes orientados por dados que suportam matrizes não é diferente de executar qualquer outro teste controlado por dados. O único ponto-chave de diferença é que a semática dos critérios de seleção muda no caso dos parâmetros de dados de matriz para significar "contém" em vez de "igual".
Para ver o que isso significa, suponha que você deseja 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'"
Este comando executa os testes orientados por dados com índice #0 e #3 em ambos os casos acima.
Você pode criar consultas mais complexas que dizem, por exemplo, selecionar apenas o teste no qual a cor matriz contém branco e a cor matriz contém preto , que selecionaria apenas testes controlados por dados com índice #3. Como exercício, tente escrever e executar esta consulta você mesmo.