Compartir a través de


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 cubriendo los conceptos básicos, es posible que quiera empezar con una ejemplo simple controlado por datos.

Ejemplos a los que se hace referencia:

  • ArraySupportDataDrivenExample

  • CSharpDataDrivenArraySupportExample

Las secciones anteriores ya 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 Arrays en el sentido de pruebas controladas por datos de TAEF:

  • Matrices son de longitud variable, conjunto homogéneo de elementos 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 muestran 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 de en el 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 de en true. A continuación, especifique los valores de <Valor>...<etiquetas /Value>. Puede tener tantas etiquetas <Valor> 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> parameter <sin una etiqueta <Value> adicional. también, aunque el parámetro de la fila tenga solo un valor, se sigue tratando como una matriz de un elemento y no se puede recuperar de otro modo.

Ahora, eche un vistazo a las API de recuperación.

recuperación nativa de

Los elementos de matriz se pueden recuperar en código nativo mediante la WEX::TestExecution::TestDataArray<> clase de plantilla. 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, tamaños es una matriz de tipos int y colores 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 tamañoy coloque el valor en la variable local tamaños.

Tenga en cuenta que un intento de recuperar un parámetro especificado sin matriz en una matriz produce un error y produce un error en la prueba. 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 row. Si intenta recuperar Tamaño 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 como se indica a continuación:

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

En este caso, un intento de recuperar tamaño sería correcto, pero el tamaño de la matriz sería 0.

recuperación administrada de

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 ningún 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 row. Si intenta recuperar tamaño del 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 en primer lugar y realizar los pasos adecuados después de comparar el tipo de objeto con typeof(System.DBNull) o el tipo que está respetando.

Por otro lado, puede especificar una matriz vacía especificando una etiqueta de parámetro vacía para Tamaño como se indica a continuación:

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

En este caso, un intento de recuperar tamaño devuelve correctamente una matriz vacía de tipo System.Int32[].

ejecución de

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 las sematicas de los criterios de selección cambian en el caso de los parámetros de datos de matriz para indicar "contains" en lugar de "equals".

Para ver lo que significa esto, supongamos que desea seleccionar todas las pruebas controladas por datos en las que la matriz Color de contiene el valor Blanco. Para comprobarlo, ejecute el siguiente comando:

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 color de contiene blanca y la matriz de de color 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.