Ejemplo de prueba controlada por datos de compatibilidad con matrices
En esta sección se tratan algunas características avanzadas de las pruebas controladas por datos a modo de ejemplo. Si sigue conociendo los conceptos básicos, es posible que quiera empezar con un ejemplo simple controlado por datos.
Ejemplos de referencia:
ArraySupportDataDrivenExample
CSharpDataDrivenArraySupportExample
En las secciones anteriores ya se han tratado los conceptos básicos de la creación y ejecución de pruebas controladas por datos. En la lista siguiente se describe el significado de matrices en el sentido de pruebas controladas por datos de TAEF:
- Las matrices son conjuntos de elementos de longitud variable y tipo homogéneo que se tratan como un único parámetro.
- Para especificar un tipo de matriz, debe especificar explícitamente el tipo del parámetro en el bloque ParameterTypes y agregar un atributo Array="true".
Los tipos de parámetro que se admiten se enumeran en Tipos de parámetros en orígenes de datos de tabla.
Si se especifica cualquier otro tipo de datos, la prueba produce una advertencia y considera que es una cadena. En el caso de matrices, el tipo de datos se consideraría de tipo String[].
En el ejemplo siguiente se muestra cómo especificar que el parámetro es una matriz de uno de los tipos básicos. Es importante tener en cuenta que no hay tipos predeterminados permitidos en el caso de matrices: debe especificar explícitamente el tipo y establecer el atributo Array para que el parámetro sea 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 las etiquetas Value y los atributos Array del ejemplo anterior. En primer lugar, debe especificar explícitamente el tipo para los parámetros Size y Color y especificar que estos parámetros son matrices estableciendo el atributo Array en true. A continuación, especifique los valores en las etiquetas <Value>...</Value>. Puede tener tantas etiquetas <Value> como necesite para especificar cualquier número de valores dentro de la matriz para un parámetro Row determinado.
Observe las líneas 9, 10, 30 y 33 en los ejemplos XML anteriores. Estas entradas son elementos de matriz con valores únicos. En otras palabras, puede especificar elementos de matriz con valores únicos directamente en la etiqueta <Parameter> sin una etiqueta <Value> adicional. Además, aunque el parámetro de la fila solo tiene un valor, se trata como una matriz de un elemento y no se puede recuperar de otra manera.
Ahora, eche un vistazo a las API de recuperación.
Recuperación nativa
Los elementos de matriz se pueden recuperar en código nativo mediante la clase de plantilla WEX::TestExecution::TestDataArray<>. Consulte el encabezado publicado TestData.h para obtener más información. La clase TestDataArray administra la duración de los elementos de matriz y proporciona API útiles para recuperar valores específicos dentro de la 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 */
Puede obtener la longitud de la matriz llamando a GetSize y puede obtener un elemento específico mediante el operador [].
En el ejemplo siguiente se muestra cómo usar estas funciones en el código. Considere el archivo cpp en el ejemplo 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 }
En primer lugar, debe definir una clase TestDataArray local del tipo de matriz. En este caso, sizes es una matriz de tipo int colors es una matriz de tipo WEX::Common::String. La API para recuperar una matriz es similar a la que recupera cualquier variable. Llame a TestData::TryGetValue, pídale que recupere el parámetro size y coloque el valor en sizes de la variable local.
Tenga en cuenta que un intento de recuperar un parámetro especificado sin matriz en una matriz produce un error y hace que la prueba falle. Del mismo modo, un intento de recuperar una matriz en una variable que no es de matriz, incluso si la matriz solo tiene un elemento, produce un error.
Si no se especifica ningún parámetro de matriz en la fila XML, se produce un error al intentar recuperar el parámetro. Por ejemplo, si una fila tiene el siguiente aspecto:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Observe que el parámetro Size, que es una matriz, no se especifica en la fila. Si intenta recuperar Size del código, la llamada API devolvería un código de retorno con error. Puede usarlo para definir un valor de matriz predeterminado.
Por otro lado, puede especificar una matriz vacía especificando una etiqueta de parámetro vacía para Size de la siguiente manera:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
En este caso, un intento de recuperar size sería correcto, pero el tamaño de la matriz sería 0.
Recuperación administrada
La recuperación administrada sigue siendo casi la misma que antes; solo debe asegurarse de recuperar los valores en una variable local del tipo de matriz adecuado. Considere el ejemplo administrado siguiente:
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 }
De forma similar a la recuperación nativa, si no se especifica un parámetro de matriz en la fila XML, un intento de recuperar el parámetro devuelve un objeto de tipo System.DBNull. Por ejemplo, si una fila tiene el siguiente aspecto:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Observe que el parámetro Size, que es una matriz, no se especifica en la fila. Si intenta recuperar Size desde el código, la llamada API devolvería un objeto de tipo DBNull. Si tiene estos valores en la tabla, es posible que desee recuperarlos del contexto en un objeto primero y realizar los pasos adecuados después de comparar el tipo de objeto con typeof(System.DBNull) o el tipo que se está ejecutando.
Por otro lado, puede especificar una matriz vacía especificando una etiqueta de parámetro vacía para Size de la siguiente manera:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
En este caso, un intento de recuperar size devuelve correctamente una matriz vacía de tipo System.Int32[].
Ejecución
La ejecución de pruebas controladas por datos que admiten matrices no es diferente de ejecutar ninguna otra prueba controlada por datos. El único punto clave de diferencia es que la semántica de los criterios de selección cambia en el caso de los parámetros de datos de matriz para significar "contiene" en lugar de "es igual a".
Para ver lo que significa esto, supongamos que desea seleccionar todas las pruebas controladas por datos donde la matriz Color contiene el valor Blanco. Para hacerlo, ejecute lo siguiente:
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 ejecuta las pruebas controladas por datos con el índice 0 y 3 en ambos casos anteriores.
Puede crear consultas más complejas, por ejemplo, seleccionar solo la prueba en la que la matriz de colores contiene blanco y la matriz de colores contiene negro, que solo seleccionaría pruebas controladas por datos con el índice 3. Como ejercicio, pruebe a escribir y ejecutar esta consulta usted mismo.