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 van a pasar para FileName y para FileExtension por separado de la siguiente manera:

  • FileName: a, z12390, Realllyreallyreallylonglonglonglonglonglonglonglonglonglong, 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 salirse fácilmente de los límites mientras considera más variaciones para agregar a la lista. En estos escenarios de caso de prueba, PICT podría agregar un montón de valor mediante la generación de 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 con 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, primero pruébelo en el símbolo del sistema:

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

Pict.exe está disponible junto al resto de los binarios en el recurso compartido del último lanzamiento de TAEF.

Una vez que haya terminado de elaborar 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 etiquetar las pruebas para indicar a TAEF 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 propósito. Use la tabla siguiente para asignar las opciones de comando de Pict.exe a los metadatos de TAEF.

sintaxis de comandos pict.exe Sintaxis nativa de metadatos de TAEF Sintaxis gestionada de metadatos de TAEF
/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 la línea de comandos, en la propiedad DataSource, o como metadatos de nivel de prueba, clase o módulo, con dicha prioridad. Para configurarlo en la ventana de comandos, 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 nombre de metadato = valor de metadato separados por el símbolo &. 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 genera 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, puede establecer explícitamente "Pict:Random" en false para que TAEF ignore "Pict:RandomSeed".

El tiempo de espera predeterminado permitido para que PICT.exe se ejecute en el archivo de modelo y la entrada del archivo de inicialización especificado es de 5 minutos. Si el archivo de modelo es más complejo y necesita más de 5 minutos para que PICT.exe devuelva resultados, puede anular este tiempo de espera especificando los metadatos ":Pict:Timeout:" como se muestra en el ejemplo de CPP anterior. En el ejemplo, se especifica un tiempo de espera de 1,5 minutos a través del formato estándar de tiempo de espera de TAEF . Al igual que los demás metadatos de 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 lo hizo para las pruebas basadas en datos basadas en tablas con TAEF, mediante la clase TestData para 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. Í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 su prueba lo 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 con la elaboración de la prueba basada en PICT usando TAEF, puede invocarla desde el símbolo del sistema y aplicar todas las características de comando que ofrece TAEF: como /list para obtener una lista de todos los métodos de prueba que se generarán utilizando 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 estos. Lo clave que debe tener en cuenta antes de empezar es asegurarse de que pict.exe está en su ruta.

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 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 de PICT

Algunos archivos de modelo pueden ser muy complejos y pueden requerir más tiempo para procesarlo 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 a la misma combinación de modelos y 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 la línea de comandos 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 han 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 establecerlo 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 información sobre te_cmd.

set te_cmd = /persistPictResults

Los archivos de resultados almacenados en caché se almacenan en una carpeta denominada "TAEF-PICT" en %temp% directorio, 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á borrar los resultados almacenados en caché, pero si no puede hacerlo, verá un error relacionado con esto. 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.

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

DataSource como un recurso

Puede agregar modelos PICT y archivos de inicializació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 permanecerá igual 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 buscando en los recursos del módulo de prueba. Dado que cambiar el DataSource almacenado en el recurso requiere volver a compilar, puede aprovechar este diseño copiando el archivo DataSource a la misma ubicación que el archivo de la dll de prueba durante el desarrollo (y nombrar el recurso igual que el archivo). Una vez finalizada la prueba, mueva (no copie) el archivo al directorio de código y vuelva a compilar para insertar el recurso.