Clase controlada por datos
Asegúrese de que está familiarizado con la ejecución básica de TAEF y sabe cómo crear pruebas con ella antes de continuar con esta sección. Es posible que también quiera seguir el tutorial del ejemplo de prueba simple controlado por datos. En esta sección, realizará una clase de prueba controlada por datos basada en una prueba basada en tablas controlada por datos, pero el mismo enfoque se aplica a las pruebas basadas en WMI o basadas en PICT .
¿Cuándo usar una clase controlada por datos?
Hay ocasiones en las que varias pruebas podrían depender de los mismos datos de entrada. Al probar las API, puede que quiera ejecutar varias pruebas de API con los mismos datos para obtener una vista coherente del comportamiento de la API. Al realizar pruebas de nivel de escenario, es posible que desee asegurarse de que todos los pasos del escenario se prueban con los mismos datos. En estos momentos, resulta útil especificar los datos de prueba en el nivel de clase.
Creación de una clase controlada por datos
Especifique que una clase determinada está controlada por datos de forma similar a cómo se especifica que una prueba determinada está controlada por datos. Los metadatos de DataSource se aplican en el nivel de clase. El valor identifica el origen de datos concreto de interés. En el ejemplo siguiente se muestra cómo especificar estas propiedades para las clases controladas por datos:
Código nativo
1 class 2 {
2 BEGIN_TEST_CLASS(DataDrivenClassExample)
3 TEST_CLASS_PROPERTY(L"DataSource", L"Table:DataDrivenClassExample.xml#ClassTable")
4 END_TEST_CLASS()
5
6 TEST_METHOD(Test1);
7 {
8 int size;
9 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
10 {
11 VERIFY_ARE_NOT_EQUAL(size, 0);
12 Log::Comment(String().Format(L"Size retrieved was %d", size));
13 }
14
15 String color;
16 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
17 {
18 Log::Comment(L"Color retrieved was " + color);
19 }
20 }
21 TEST_METHOD(Test2);
22 {
23 int size;
24 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
25 {
26 VERIFY_ARE_NOT_EQUAL(size, 0);
27 Log::Comment(String().Format(L"Size retrieved was %d", size));
28 }
29
30 String color;
31 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
32 {
33 Log::Comment(L"Color retrieved was " + color);
34 }
35 }
36 };
Código administrado
1 [TestClass]
2 public class CSharpDataDrivenClassExample
3 {
4 [ClassInitialize]
5 [DataSource("Table:CSharpDataDrivenClassExample.xml#ClassTable")]
6 public static void MyClassInitialize(Object testContext)
7 {
8 }
9
10 [TestMethod]
11 public void Test1()
12 {
13 int size = (int)m_testContext.DataRow["Size"];
14 Verify.AreNotEqual(size, 0);
15 Log.Comment("Size is " + size.ToString());
16
18 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
19 }
20
21 [TestMethod]
22 public void Test2()
23 {
24 int size = (int)m_testContext.DataRow["Size"];
25 Verify.AreNotEqual(size, 0);
26 Log.Comment("Size is " + size.ToString());
27
28 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
29 }
30
31 public TestContext TestContext
32 {
33 get { return m_testContext; }
34 set { m_testContext = value; }
35 }
36
37 private TestContext m_testContext;
38 }
En estos ejemplos, la línea 3 del ejemplo de código nativo y la línea 5 del ejemplo de código administrado son las formas recomendadas de especificar el origen de datos para una clase de prueba controlada por datos en TAEF.
En el ejemplo de código administrado anterior, las líneas 13, 18, 24 y 28 muestran cómo se ponen a disposición de los datos los métodos de prueba para el código administrado.
En el ejemplo de código siguiente, las líneas 4, 11, 20 y 27 muestran cómo se ponen a disposición de los datos los métodos de prueba para el código nativo. Tenga en cuenta que los datos definidos en la tabla (filas) de la clase controlada por datos están disponibles para los métodos de prueba de la clase (Test1 y Test2) exactamente de la misma manera que lo haría para una prueba controlada por datos.
El archivo XML dataSource se construye para una clase controlada por datos exactamente de la misma manera que lo haría para una prueba controlada por datos. En los ejemplos siguientes se muestran los archivos XML para clases nativas y administradas.
Nativo
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="ClassTable">
4 <ParameterTypes>
5 <ParameterType Name="Size">int</ParameterType>
6 </ParameterTypes>
7 <Row>
8 <Parameter Name="Size">4</Parameter>
9 <Parameter Name="Color">White</Parameter>
10 </Row>
11 <Row>
12 <Parameter Name="Size">10</Parameter>
13 <Parameter Name="Color">Black</Parameter>
14 </Row>
15 <Row>
16 <Parameter Name="Size">9</Parameter>
17 <Parameter Name="Color">Orange</Parameter>
18 </Row>
19 <Row>
20 <Parameter Name="Size">9</Parameter>
21 <Parameter Name="Color">Blue</Parameter>
22 </Row>
23 </Table>
24</Data>
Administrado
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="ClassTable">
4 <ParameterTypes>
5 <ParameterType Name="Size">Int32</ParameterType>
6 <ParameterType Name="Color">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">10</Parameter>
14 <Parameter Name="Color">Black</Parameter>
15 </Row>
16 <Row>
17 <Parameter Name="Size">9</Parameter>
18 <Parameter Name="Color">Orange</Parameter>
19 </Row>
20 <Row>
21 <Parameter Name="Size">9</Parameter>
22 <Parameter Name="Color">Blue</Parameter>
23 </Row>
24 </Table>
25</Data>
¿Qué esperar en segundo plano?
De forma predeterminada, cuando crea pruebas en TAEF, el orden de ejecución dentro de una clase es el mismo que el orden en el que ha codificado los métodos de prueba en la clase . Por lo tanto, en los ejemplos anteriores, Test1 siempre se ejecutará antes de Test2. Dado que la clase que contiene Test1 y Test2 es una clase controlada por datos, todos los métodos de clase se ejecutarán una vez para cada fila de datos que haya definido en DataSource. En otras palabras, Test1 y Test2 se ejecutan para la fila #0. A continuación, estos métodos se ejecutan en el mismo orden para row #1 y así sucesivamente hasta que TAEF ejecuta todas las filas.
Ejecución de pruebas en una clase controlada por datos
Si ejecuta los archivos binarios de prueba de ejemplo con la opción de comando /list , el orden de ejecución de la sección anterior queda claro.
Nativo
TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
WEX::TestExecution::Examples::DataDrivenClassExample#0
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#1
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#2
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#3
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2
Administrado
TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
WEX.Examples.CSharpDataDrivenClassExample#0
WEX.Examples.CSharpDataDrivenClassExample#0.Test1
WEX.Examples.CSharpDataDrivenClassExample#0.Test2
WEX.Examples.CSharpDataDrivenClassExample#1
WEX.Examples.CSharpDataDrivenClassExample#1.Test1
WEX.Examples.CSharpDataDrivenClassExample#1.Test2
WEX.Examples.CSharpDataDrivenClassExample#2
WEX.Examples.CSharpDataDrivenClassExample#2.Test1
WEX.Examples.CSharpDataDrivenClassExample#2.Test2
WEX.Examples.CSharpDataDrivenClassExample#3
WEX.Examples.CSharpDataDrivenClassExample#3.Test1
WEX.Examples.CSharpDataDrivenClassExample#3.Test2
Observe que los índices de los ejemplos anteriores son similares a las pruebas controladas por datos. Cada fila de la clase controlada por datos se identifica mediante un índice. Al igual que en las pruebas controladas por datos, puede optar por asignar a cualquier fila un nombre corto más significativo especificando los metadatos en el nivel de fila en el archivo XML e imprimiendo ese nombre en lugar del índice al enumerar o ejecutar las pruebas.
Del mismo modo, se usa la opción /listproperties para confirmar que los datos se especifican y están disponibles en el nivel de clase.
Nativo
F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
WEX::TestExecution::Examples::DataDrivenClassExample#0
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = White
Data[Size] = 4
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#1
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = Black
Data[Size] = 10
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#2
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = Orange
Data[Size] = 9
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#3
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = Blue
Data[Size] = 9
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2
Administrado
F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
WEX.Examples.CSharpDataDrivenClassExample#0
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = White
Data[Size] = 4
WEX.Examples.CSharpDataDrivenClassExample#0.Test1
WEX.Examples.CSharpDataDrivenClassExample#0.Test2
WEX.Examples.CSharpDataDrivenClassExample#1
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = Black
Data[Size] = 10
WEX.Examples.CSharpDataDrivenClassExample#1.Test1
WEX.Examples.CSharpDataDrivenClassExample#1.Test2
WEX.Examples.CSharpDataDrivenClassExample#2
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = Orange
Data[Size] = 9
WEX.Examples.CSharpDataDrivenClassExample#2.Test1
WEX.Examples.CSharpDataDrivenClassExample#2.Test2
WEX.Examples.CSharpDataDrivenClassExample#3
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = Blue
Data[Size] = 9
WEX.Examples.CSharpDataDrivenClassExample#3.Test1
WEX.Examples.CSharpDataDrivenClassExample#3.Test2
Puede aplicar todas las reglas de ejecución a la clase controlada por datos. Puede basar la consulta de selección en cualquier cosa que pueda enumerar en la opción /listproperties .
Pruebas controladas por datos en una clase controlada por datos
No se le limita de ninguna manera tener pruebas controladas por datos dentro de una clase controlada por datos. Este enfoque puede ser útil al escribir pruebas de API. Puede mantener los datos comunes para todas las pruebas de una clase en el nivel de clase DataSource. Especifique los datos que son específicos del método de prueba en los metadatos de DataSource para el método que marca como controlado por datos.
NOTA: En tales casos, el orden de ejecución es un poco más implicado.
En los ejemplos siguientes se muestra cómo se representan los dos archivos binarios de ejemplo anteriores con la opción de comando /list .
Nativo
TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
WEX::TestExecution::Examples::NestedDataDrivenExample#0
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#3
WEX::TestExecution::Examples::NestedDataDrivenExample#1
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#3
WEX::TestExecution::Examples::NestedDataDrivenExample#2
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#3
WEX::TestExecution::Examples::NestedDataDrivenExample#3
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#3
Administrado
TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
WEX.Examples.CSharpDataDrivenNestedExample#0
WEX.Examples.CSharpDataDrivenNestedExample#0.Test1
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#3
WEX.Examples.CSharpDataDrivenNestedExample#1
WEX.Examples.CSharpDataDrivenNestedExample#1.Test1
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#3
WEX.Examples.CSharpDataDrivenNestedExample#2
WEX.Examples.CSharpDataDrivenNestedExample#2.Test1
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#3
WEX.Examples.CSharpDataDrivenNestedExample#3
WEX.Examples.CSharpDataDrivenNestedExample#3.Test1
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#3
NOTA: La única restricción en este caso es que las tablas de los dos ejemplos no pueden estar en el mismo archivo DataSource. En otras palabras, el DataSource para la clase controlada por datos y el método de prueba controlado por datos que contiene deben ser diferentes.
Observe que el método Test2 en nuestros ejemplos es una prueba controlada por datos dentro de una clase controlada por datos. Por ejemplo, en la línea WEX. Examples.CSharpDataDrivenNestedExample#3.Test2#0, #3 es el índice de la clase y #0 es el índice de la prueba controlada por datos dentro de esa clase. Test2 puede tener acceso a ambas tablas: los datos de la fila de la instancia de clase a la que pertenece y los datos de la fila actual para su propia tabla DataSource . En otras palabras, los datos en el nivel de clase y los datos en el nivel de método de prueba se agregan juntos y están disponibles durante la ejecución del método de prueba.
¿Qué ocurre en el caso de datos en conflicto: si se especifica el mismo nombre de datos tanto en el nivel de clase como en el nivel de método? TAEF procesa esta condición de la misma manera que procesa las propiedades de metadatos. Los datos especificados en una fila en el nivel de método reemplazan los datos especificados en una fila en el nivel de clase.
Por ejemplo, considere el caso cuando tenga un parámetro denominado Size especificado tanto en el nivel de clase como en el nivel de método de prueba. En el nivel de clase, Size se define como de tipo String Array , pero en el nivel de método de prueba, se define como un valor int. En este caso, el tipo int invalida el tipo String Array en el nivel de método de prueba, así como en los métodos Setup y Teardown para la prueba. Sin embargo, en los métodos Setup y Teardown en el nivel de clase, Size tiene el tipo de datos String Array .
Si tiene datos en conflicto en el código, TAEF muestra una advertencia durante la ejecución y enumera las propiedades, pero los datos en conflicto no darán lugar a ningún error.