Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Esta seção aborda alguns recursos avançados de testes controlados por dados por meio de exemplo. Se você ainda estiver cobrindo as noções básicas, talvez queira começar com um exemplo simples baseado em dados.
Exemplos referenciados:
ArraySupportDataDrivenExample
CSharpDataDrivenArraySupportExample
As seções anteriores já abordaram as noções básicas de criação e execução de teste controladas por dados. A lista a seguir discute o significado de matrizes no sentido de teste controlado por dados do TAEF:
- Matrizes são comprimento variável, conjunto de tipos homogêneos 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âmetro com suporte são listados em tipos de parâmetro em fontes de dados de tabela.
Se qualquer outro tipo de dados for especificado, o teste lançará um aviso e o considerará uma cadeia de caracteres. 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 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 verdadeiro.
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 marcas de de Valor e os atributos matriz no exemplo acima. Primeiro, você deve especificar explicitamente o tipo para os parâmetros tamanho e Color e especificar que esses parâmetros são matrizes, definindo o atributo Array como verdadeiro. Em seguida, especifique os valores em <Valor>...</Valor> marcas. Você pode ter quantas marcas <Valor> que precisar 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 XML acima. Essas entradas são elementos de matriz com valor único. Em outras palavras, você pode especificar elementos de matriz com valor único diretamente na marca de> de parâmetro <sem uma marca de> de valor de <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 do
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 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 exemplo a seguir 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 de cores de tipo int e é uma matriz do tipo WEX::Common::String. A API para recuperar uma Matriz é semelhante àquela que recupera qualquer variável. Você chama TestData::TryGetValue, solicita que ele recupere o parâmetro tamanhoe coloque o valor na variável local tamanhos.
Observe que uma tentativa de recuperar um parâmetro não especificado de 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, causará 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 tivesse a seguinte aparência:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Observe que o parâmetro Size, que é uma matriz, não é especificado na Linha. Se você tentar recuperar Tamanho do código, a chamada à 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 teria êxito, mas o tamanho da matriz seria 0.
Recuperação Gerenciada
A recuperação gerenciada permanece quase a mesma de antes – somente você precisa 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 tivesse a seguinte aparência:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Observe que o parâmetro Size, que é uma matriz, não é especificado na Linha. Se você tentar recuperar Tamanho do código, a chamada à 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 tomar as etapas apropriadas depois de comparar o tipo de objeto com typeof(System.DBNull) ou o tipo que você está exepecindo 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 retorna uma matriz vazia do tipo System.Int32[].
Execução do
A execução de testes controlados por dados que dão suporte a matrizes não é diferente da execução de qualquer outro teste controlado por dados. O único ponto chave da diferença é que a sematics dos critérios de seleção muda no caso de parâmetros de dados de matriz para significar "contém" em vez de "iguais".
Para ver o que isso significa, suponha que você queira selecionar todos os testes controlados por dados em que a matriz de Cor contém o valor Branco. Para 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 nº 0 e nº 3 em ambos os casos acima.
Você pode criar consultas mais complexas que dizem, por exemplo, selecionar apenas o teste no qual a matriz de de cores contém branco e a cor matriz contém preto, que selecionaria apenas testes controlados por dados com índice nº 3. Como um exercício, tente escrever e executar essa consulta por conta própria.