Compartir a través de


Origen de datos PICT

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.

Fondo y referencias pict

PICT significa Pairwise Independent Combinatorial Testing. PICT permite especificar variaciones para cada uno de los parámetros por separado. Por ejemplo, si la prueba de API depende de dos parámetros: FileName y FileExtension, podría pensar en las posibles variaciones que se deben pasar para FileName y para FileExtensions por separado de la siguiente manera:

  • FileName: a, z12390, Realllyreallyreallylonglong, normallength
  • FileExtension: txt, png, bat, doc, exe, bmp, wav

Ahora, puede ver que una expansión combinatoria de fuerza bruta de lo anterior (4 X 7 = 28) podría salir fácilmente de los límites a medida que piensa en más variaciones para agregar a la lista. En estos escenarios de caso de prueba, PICT podría agregar mucho valor generando un conjunto compacto de resultados de parámetros para obtener una cobertura combinatoria completa sobre los parámetros de entrada.

Compatibilidad con PICT en TAEF

TAEF ofrece compatibilidad integrada para pruebas basadas en PICT.

Para aprovechar esto, escriba el archivo de modelo de entrada para pict.exe como lo haría normalmente. Consulte los archivos *.txt en la carpeta de ejemplos mencionada anteriormente. Puede ser útil probar si PICT se ejecuta según lo previsto en el archivo de modelo; para ello, pruébelo primero en el símbolo del sistema:

pict.exe <model file> [/e:<seed file>]

Pict.exe está disponible con el resto de los archivos binarios en la versión más reciente de TAEF.

Una vez que haya terminado de crear el archivo de modelo (y el archivo de inicialización) para PICT y lo haya comprobado con pict.exe en el símbolo del sistema, ahora puede marcar las pruebas para que TAEF sepa que son pruebas controladas por PICT. Si está familiarizado con las pruebas basadas en datos basadas en tablas disponibles en TAEF, encontrará esto muy similar.

Código nativo:

1     class PictExample
2     {
3         TEST_CLASS(PictExample)
4
5         BEGIN_TEST_METHOD(SimpleTest)
6             TEST_METHOD_PROPERTY(L"DataSource", L"pict:PictExample.txt")
7         END_TEST_METHOD()
8
9         BEGIN_TEST_METHOD(TestWithSeed)
10            TEST_METHOD_PROPERTY(L"DataSource", L"pict:TestWithSeed.txt")
11            TEST_METHOD_PROPERTY(L"Pict:SeedingFile", L"TestWithSeed.sed")
12            TEST_METHOD_PROPERTY(L"Pict:Timeout", L"00:01:30")
13        END_TEST_METHOD()
14
15        BEGIN_TEST_METHOD(TestWithFunction)
16            TEST_METHOD_PROPERTY(L"DataSource", L"pict:TestWithFunction.txt")
17        END_TEST_METHOD()
18    };

Código administrado:

1     [TestClass]
2     public class CSharpPictExample
3     {
4         [TestMethod]
5         [DataSource("pict:ConstraintsTest.txt")]
6         [TestProperty("Pict:SeedingFile", "ConstraintsTest.seed")]
7         public void ConstraintsTest()
8         {
9             ...
10        }
11
12        [TestMethod]
13        [DataSource("pict:SumofSquareRoots.txt")]
14        public void SumOfSquareRoots()
15        {
16            ...
17        }
18
19        public TestContext TestContext
20        {
21            get { return m_testContext; }
22            set { m_testContext = value; }
23        }
24
25        private TestContext m_testContext;
26    }

Como se muestra en los ejemplos anteriores, debe especificar el nombre del archivo de modelo como DataSource. Debe prefijar el nombre del archivo de modelo con "pict:" y proporcionarlo como DataSource para el método de prueba. En el caso de la prueba administrada, al igual que con cualquier otra prueba controlada por datos con TAEF, debe proporcionar los métodos get y set de la propiedad TestContext y tener una instancia privada de la misma en la clase.

Si desea pasar opciones de comando a PICT, puede usar metadatos para este fin. Use la tabla siguiente para asignar las opciones de comando de Pict.exe a metadatos de TAEF.

sintaxis de comandos de pict.exe Sintaxis nativa de metadatos de TAEF Sintaxis de metadatos de TAEF administrada
/o:3 TEST_METHOD_PROPERTY(L"Pict:Order", L"3") [TestProperty("Pict:Order", "3")]
/D: TEST_METHOD_PROPERTY(L"Pict:ValueSeparator", L",") [TestProperty("Pict:ValueSeparator", ",")]
/a: TEST_METHOD_PROPERTY(L"Pict:AliasSeparator", L"
/N:~ TEST_METHOD_PROPERTY(L"Pict:NegativeValuePrefix", L"~") [TestProperty("Pict:NegativeValuePrefix", "~")]
/e:test.seed TEST_METHOD_PROPERTY(L"Pict:SeedingFile", L"test.seed") [TestProperty("Pict:SeedingFile", "test.seed")]
/r TEST_METHOD_PROPERTY(L"Pict:Random", L"true") [TestProperty("Pict:Random", "true")]
/r:33 TEST_METHOD_PROPERTY(L"Pict:RandomSeed", L"33") [TestProperty("Pict:RandomSeed", "33")]
/C TEST_METHOD_PROPERTY(L"Pict:CaseSensitive", L"true") [TestProperty("Pict:CaseSensitive", "true")]

Cualquiera de los metadatos anteriores se puede establecer en el símbolo del sistema, en la propiedad DataSource o como metadatos de nivel de prueba, clase o módulo, con prioridad en ese orden. Para establecerlo en el símbolo del sistema, use la sintaxis :

te.exe <test dll> /Pict:Order=3 /Pict:SeedingFile=test.seed

Para establecer metadatos en la propiedad DataSource, anexe el nombre del archivo de modelo con un carácter de signo de interrogación (?) y, a continuación, un conjunto de pares de valores de metadatos separados por y comercial . Al usar este método, el prefijo "Pict:" para los nombres de metadatos es opcional. Este es un ejemplo:

TEST_METHOD_PROPERTY(L"DataSource", L"Pict:model.txt?Order=3&CaseSensitive=true&Random=true")

En segundo plano, TAEF proporcionará el archivo de modelo de entrada y las opciones de comando a PICT y obtendrá los resultados. Si PICT produce errores o advertencias, verá estas advertencias registradas como advertencias por TAEF. Para cada fila de salida resultante que genere PICT, TAEF volverá a invocar la prueba en cuestión.

Al establecer el valor "Pict:RandomSeed" se cambiará el valor predeterminado de "Pict:Random" de false a true. De este modo, puedes establecer explícitamente "Pict:Random" en false para que TAEF omita "Pict:RandomSeed".

El tiempo de espera predeterminado permitido para que PICT.exe se ejecute en el archivo de modelo y la entrada de archivo de inicialización especificada es de 5 minutos. Si el archivo de modelo está más implicado y necesita más de 5 minutos para que PICT.exe devuelva resultados, puede invalidar este tiempo de espera, tal como se muestra en el ejemplo de CPP anterior especificando los metadatos "Pict:Timeout ". En el ejemplo, se especifica un tiempo de espera de 1,5 minutos a través del formato de tiempo de espera de TAEF estándar. Al igual que los demás metadatos PICT, los metadatos "Pict:Timeout" se heredan y, por tanto, se pueden especificar para toda la clase o módulo.

Puede acceder a los valores de datos durante una invocación determinada desde el método de prueba y sus métodos de configuración y limpieza asociados de la misma manera que para las pruebas basadas en datos basadas en tablas con TAEF, mediante la clase TestData para el código nativo y el uso de TestContext para código administrado de la siguiente manera:

Código nativo:

1     void PictExample::SimpleTest()
2     {
3         String valueA;
4         if (SUCCEEDED(TestData::TryGetValue(L"A", valueA)))
5         {
6           Log::Comment(L"A retrieved was " + valueA);
7         }
8
9         String valueB;
10        if (SUCCEEDED(TestData::TryGetValue(L"B", valueB)))
11        {
12            Log::Comment(L"B retrieved was " + valueB);
13        }
14
15        String valueC;
16        if (SUCCEEDED(TestData::TryGetValue(L"C", valueC)))
17        {
18            Log::Comment(L"C retrieved was " + valueC);
19        }
20
21        unsigned int index;
22        if (SUCCEEDED(TestData::TryGetValue(L"index", index)))
23        {
24            Log::Comment(String().Format(L"At index %d", index));
25        }
26    }

Código administrado:

1      [TestClass]
2      public class CSharpPictExample
3      {
4          [TestMethod]
5          [DataSource("pict:ConstraintsTest.txt")]
6          public void ConstraintsTest()
7          {
8              Log.Comment("A is " + m_testContext.DataRow["A"]);
9              Log.Comment("B is " + m_testContext.DataRow["B"]);
10             Log.Comment("C is " + m_testContext.DataRow["C"]);
11             Log.Comment("D is " + m_testContext.DataRow["D"]);
12
13             UInt32 index = (UInt32)m_testContext.DataRow["Index"];
14             Log.Comment("At index " + index.ToString());
15        }
16
17        [TestMethod]
18        [DataSource("pict:SumofSquareRoots.txt")]
19        public void SumOfSquareRoots()
20        {
21             Log.Comment("A is " + m_testContext.DataRow["A"]);
22             Log.Comment("B is " + m_testContext.DataRow["B"]);
23
24             UInt32 index = (UInt32)m_testContext.DataRow["Index"];
25             Log.Comment("At index " + index.ToString());
26        }
27
28        public TestContext TestContext
29        {
30             get { return m_testContext; }
31             set { m_testContext = value; }
32        }
33
34        private TestContext m_testContext;
35    }

Al igual que con las pruebas controladas por datos en TAEF, "Index" está reservado y no debe usarse como nombre de parámetro. El índice hace referencia implícitamente al índice de la invocación del método de prueba y es accesible desde el método de prueba si la prueba la necesita.

También es importante tener en cuenta que, en el caso de las pruebas basadas en PICT, se supone que el tipo de datos de todos los parámetros es WEX::Common::String (nativo), String(administrado) o VT_BSTR(script). La conversión y la interpretación se dejan al usuario.

Ahora que ha terminado de crear la prueba basada en PICT mediante TAEF, puede invocarla desde el símbolo del sistema y aplicar todas las características de comando que TAEF ofrece: como /list para obtener una lista de todos los métodos de prueba que se generarán mediante la salida PICT como datos, /listproperties para obtener una lista de los nombres de método de prueba junto con los metadatos y los valores de datos asociados a Etc. Lo clave que hay que tener en cuenta antes de empezar es asegurarse de que pict.exe está en la ruta de acceso.

Estos son algunos ejemplos:

te Examples\CPP.Pict.Example.dll /list /name:*SimpleTest*
Test Authoring and Execution Framework v2.9.3k for x86
        f:\ Examples\CPP.Pict.Example.dll
            WEX::TestExecution::Examples::PictExample
                WEX::TestExecution::Examples::PictExample::SimpleTest#0
                WEX::TestExecution::Examples::PictExample::SimpleTest#1
                WEX::TestExecution::Examples::PictExample::SimpleTest#2
                WEX::TestExecution::Examples::PictExample::SimpleTest#3
                WEX::TestExecution::Examples::PictExample::SimpleTest#4
                WEX::TestExecution::Examples::PictExample::SimpleTest#5
                WEX::TestExecution::Examples::PictExample::SimpleTest#6
                WEX::TestExecution::Examples::PictExample::SimpleTest#7
                WEX::TestExecution::Examples::PictExample::SimpleTest#8
                WEX::TestExecution::Examples::PictExample::SimpleTest#9
                WEX::TestExecution::Examples::PictExample::SimpleTest#10
                WEX::TestExecution::Examples::PictExample::SimpleTest#11
                WEX::TestExecution::Examples::PictExample::SimpleTest#12
                WEX::TestExecution::Examples::PictExample::SimpleTest#13
                WEX::TestExecution::Examples::PictExample::SimpleTest#14
                WEX::TestExecution::Examples::PictExample::SimpleTest#15
                WEX::TestExecution::Examples::PictExample::SimpleTest#16
                WEX::TestExecution::Examples::PictExample::SimpleTest#17
                WEX::TestExecution::Examples::PictExample::SimpleTest#18
                WEX::TestExecution::Examples::PictExample::SimpleTest#19
                WEX::TestExecution::Examples::PictExample::SimpleTest#20
                WEX::TestExecution::Examples::PictExample::SimpleTest#21
                WEX::TestExecution::Examples::PictExample::SimpleTest#22
                WEX::TestExecution::Examples::PictExample::SimpleTest#23

Para obtener más información sobre los criterios de selección (/select y /name), consulte la página wiki Selección.

te Examples\Csharp.Pict.Example.dll /listproperties /select:"@Name='*SumofSquare*'
                    and @Data:index>10
Test Authoring and Execution Framework v2.9.3k for x86
        f:\ Examples\CSharp.Pict.Example.dll
            WEX.Examples.CSharpPictExample
                WEX.Examples.CSharpPictExample.SumOfSquareRoots#11
                        Property[DataSource] = pict:SumofSquareRoots.txt
                        Data[a] = 1
                        Data[b] = ~-1
                WEX.Examples.CSharpPictExample.SumOfSquareRoots#12
                        Property[DataSource] = pict:SumofSquareRoots.txt
                        Data[a] = 2
                        Data[b] = ~-1

En el ejemplo anterior se muestra cómo puede seleccionar mediante el índice. También puede elegir seleccionar en función del valor de los datos.

te Examples\Csharp.Pict.Example.dll /listproperties /select:"@Name='*SumofSquare*'
                    and (@Data:A='1' and @Data:B='1')"
Test Authoring and Execution Framework v2.9.3k for x86
        f:\ Examples\CSharp.Pict.Example.dll
            WEX.Examples.CSharpPictExample
                WEX.Examples.CSharpPictExample.SumOfSquareRoots#8
                        Property[DataSource] = pict:SumofSquareRoots.txt
                        Data[a] = 1
                        Data[b] = 1

Almacenamiento en caché de resultados pict

Algunos archivos de modelo pueden ser muy complejos y pueden requerir más tiempo para procesarse mediante Pict.exe. TAEF intenta mitigar el tiempo de procesamiento de los resultados mediante el almacenamiento en caché de los resultados durante una ejecución determinada de Te.exe. Si una prueba posterior en la misma ejecución hace referencia al mismo modelo y combinación de archivos de inicialización, TAEF usará los resultados almacenados en caché. De forma predeterminada, al final de cada ejecución se eliminan los resultados almacenados en caché.

Si desea seguir aprovechando los resultados almacenados en caché en ejecuciones posteriores, puede especificar la opción "/persistPictResults" en el símbolo del sistema durante la ejecución. Siempre que especifique "/persistPictResults" para el comando, la primera ejecución se ejecutará realmente pict.exe y puede tardar mucho tiempo, pero todas las ejecuciones posteriores usarán los resultados almacenados en caché en los casos en los que el modelo y el archivo de inicialización no se hayan modificado. Nota: Tendrá que seguir especificando "/persistPictResults" para las ejecuciones posteriores. Cualquier ejecución posterior en la que no especifique, eliminará los resultados almacenados en caché al final de esa ejecución.

Si conserva los resultados de PICT y usa datos almacenados en caché es algo que desea hacer de forma predeterminada, puede establecerlos como parte de la variable de entorno de te_cmd, como se muestra a continuación y eliminar la necesidad de especificarlos en cada ejecución. Consulte Ejecución de pruebas para obtener más detalles sobre te_cmd.

set te_cmd = /persistPictResults

Los archivos de resultados almacenados en caché se almacenan en una carpeta denominada "TAEF-PICT" en el directorio %temp%, si Te.exe tiene acceso a él o en el directorio de ejecución actual desde donde se inició Te.exe. La única vez que puede tener los resultados en un estado incoherente es si presiona Ctrl + C durante la ejecución. En tal caso, TAEF intentará eliminar los resultados almacenados en caché, pero si no puede hacerlo, verá un error al efecto. El error le pedirá que elimine la ubicación de los resultados almacenados en caché. No hacerlo puede dar lugar a un comportamiento indefinido o erróneo en las pruebas posteriores.

Gracias a la compatibilidad integrada con PICT en TAEF, ahora puede aprovechar al máximo ambas características, tanto en PICT como en las características de TAEF en la automatización de pruebas.

DataSource como un recurso

Puede agregar modelos PICT y archivos de propagación como recursos en el módulo de prueba.

En el código nativo, esto se hace especificando el nombre del recurso en lugar del nombre de archivo en los metadatos de DataSource. Este es un ejemplo:

BEGIN_TEST_METHOD(ResourceNameDataSource)
    TEST_METHOD_PROPERTY(L"DataSource", L"Pict:MyModelResourceName?SeedingFile=MySeedingResourceName")
END_TEST_METHOD()

"MyModelResourceName" y "MySeedingResourceName" son los nombres de recursos definidos en un archivo .rc. El tipo de recurso debe ser DATAFILE, a diferencia de en los orígenes de datos de tabla en los que el tipo de recurso debe ser DATASOURCE_XML.

MyModelResourceName DATAFILE "model.txt"
MySeedingResourceName DATAFILE "seed.txt"

El valor de metadatos de DataSource seguirá siendo el mismo que cuando el modelo era un archivo. Del mismo modo, en el código nativo, podría hacer que el nombre del recurso sea el mismo que el nombre de archivo. TAEF buscará primero la presencia del archivo real con el nombre DataSource. Si no se encuentra el archivo, continúe examinando los recursos del módulo de prueba. Dado que cambiar el origen de datos almacenado en el recurso requiere volver a compilar, puede aprovechar este diseño copiando el archivo DataSource en la misma ubicación que el archivo dll de prueba mientras desarrolla (y asigna el nombre del recurso para que sea el mismo que el nombre de archivo). Una vez que haya terminado de probar, mueva (no copie) el archivo al directorio de código y vuelva a compilar para insertar el recurso.