Condividi tramite


Origine dati PICT

Assicurarsi di avere familiarità con l'esecuzione di base di TAEF e sapere come creare test usando questa sezione.

Sfondo e riferimenti PICT

PICT è l'acronimo di Pairwise Independent Combinatorial Testing. PICT consente di specificare le varianti per ogni parametro separatamente. Ad esempio, se il test API dipende da due parametri: FileName e FileExtension, è possibile pensare alle possibili varianti da passare per FileName e per FileExtensions separatamente come segue:

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

Ora, si può notare che un'espansione combinatoria bruta del precedente (4 X 7 = 28) potrebbe facilmente uscire dai limiti mentre si pensa di più varianti da aggiungere all'elenco. In questi scenari di test case , PICT potrebbe aggiungere un sacco di valore generando un set compatto di risultati dei parametri per ottenere una copertura combinatoriale completa sui parametri di input.

Supporto PICT in TAEF

TAEF offre supporto integrato per i test basati su PICT.

Per sfruttare questo vantaggio, scrivere il file del modello di input per pict.exe come si farebbe normalmente. Fare riferimento ai file *.txt nella cartella esempi indicati in precedenza. Potrebbe essere utile provare se PICT viene eseguito come previsto nel file del modello provandolo al prompt dei comandi come segue:

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

Pict.exe è disponibile con il resto dei file binari nella condivisione di versione più recente di TAEF.

Dopo aver creato il file del modello (e il file di inizializzazione) per PICT, è stato verificato in base alla pict.exe al prompt dei comandi, è ora possibile contrassegnare i test per consentire a TAEF di sapere che sono test basati su PICT. Se si ha familiarità con i test basati sui dati basati su tabelle disponibili in TAEF, si troverà questo aspetto molto simile.

Codice 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    };

Codice gestito:

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    }

Come illustrato negli esempi precedenti, è necessario specificare il nome del file di modello come DataSource. È necessario prefisso il nome del file del modello con "pict:" e specificarlo come DataSource per il metodo di test. Nel caso del test gestito, analogamente a qualsiasi altro test basato su dati con TAEF, è necessario fornire i metodi get e set di proprietà TestContext e disporre di un'istanza privata della stessa classe.

Per passare le opzioni di comando a PICT, è possibile usare i metadati per questo scopo. Usare la tabella seguente per eseguire il mapping delle opzioni di comando di Pict.exe ai metadati TAEF.

sintassi del comando pict.exe Sintassi dei metadati TAEF nativa Sintassi dei metadati TAEF gestita
/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")]

Uno dei metadati precedenti può essere impostato al prompt dei comandi, nella proprietà DataSource o come metadati a livello di test, classe o modulo, con precedenza in tale ordine. Per impostarlo al prompt dei comandi, usare la sintassi:

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

Per impostare i metadati nella proprietà DataSource, aggiungere il nome del file modello con un carattere punto interrogativo (?) e quindi un set di nomi di metadati separati da ampersand = coppie di valori dei metadati. Quando si usa questo metodo, il prefisso "Pict:" per i nomi dei metadati è facoltativo. Esempio:

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

Dietro le quinte, TAEF fornirà il file del modello di input e le opzioni di comando per PICT e ottenere i risultati. Se PICT genera eventuali errori o avvisi, verranno visualizzati come avvisi registrati da TAEF. Per ogni riga di output risultante generata da PICT, TAEF richiamerà nuovamente il test in preoccupazione.

L'impostazione del valore "Pict:RandomSeed" cambierà il valore predefinito per "Pict:Random" da false a true. In questo modo, è possibile impostare in modo esplicito "Pict:Random" su false per ottenere TAEF per ignorare "Pict:RandomSeed".

Il timeout predefinito consentito per PICT.exe per l'esecuzione nel file di modello e nell'input del file di inizializzazione specificato è di 5 minuti. Se il file di modello è più coinvolto e richiede più tempo di 5 minuti per PICT.exe restituire i risultati, è possibile eseguire l'override di questo timeout come illustrato nell'esempio CPP precedente specificando i metadati "Pict:Timeout". Nell'esempio viene specificato un timeout di 1,5 minuti tramite il formato di timeout TAEF standard. Come gli altri metadati PICT, i metadati "Pict:Timeout" vengono ereditati e quindi possono essere specificati per l'intera classe o modulo.

È possibile accedere ai valori dei dati durante una determinata chiamata dal metodo di test e ai relativi metodi di installazione e pulizia associati nello stesso modo in cui è stato fatto per i test basati sui dati basati su tabelle con TAEF- usando la classe TestData per il codice nativo e usando testContext per il codice gestito come segue:

Codice 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    }

Codice gestito:

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    }

Analogamente a tutti i test basati sui dati in TAEF, "Index" è riservato e non deve essere usato come nome di parametro. L'indice fa riferimento implicitamente all'indice della chiamata al metodo di test ed è accessibile dal metodo di test se il test lo richiede.

È anche importante notare che in caso di test basati su PICT, il tipo di dati per tutti i parametri viene assunto come WEX::Common::String (nativo), String(managed) o VT_BSTR(script). La conversione e l'interpretazione viene lasciata all'utente.

Dopo aver creato il test basato su PICT usando TAEF, è possibile richiamarlo dal prompt dei comandi e applicare tutte le funzionalità dei comandi offerte da TAEF: ad esempio / list per ottenere un elenco di tutti i metodi di test che verranno generati usando l'output PICT come dati, /listproperties per ottenere un elenco dei nomi dei metodi di test insieme ai metadati e ai valori dei dati associati a and so on. La cosa chiave da notare prima di iniziare è assicurarsi che pict.exe sia nel percorso.

Ecco alcuni esempi:

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

Per altre informazioni sui criteri di selezione (/select e /name) vedere la pagina Wiki Selezione.

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

Nell'esempio precedente viene illustrato come è possibile selezionare usando l'indice. È anche possibile scegliere di selezionare in base al valore dei dati.

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

Memorizzazione nella cache dei risultati PICT

Alcuni file di modello possono essere molto complessi e potrebbero richiedere più tempo per l'elaborazione da Pict.exe. TAEF tenta di ridurre il tempo di elaborazione per i risultati memorizzando nella cache i risultati durante un'esecuzione specificata di Te.exe. Se un test successivo nella stessa esecuzione si riferisce allo stesso modello e alla combinazione di file di inizializzazione, TAEF userà i risultati memorizzati nella cache. Per impostazione predefinita, alla fine di ogni esecuzione vengono eliminati i risultati memorizzati nella cache.

Se si vuole continuare a sfruttare i risultati memorizzati nella cache nelle esecuzioni successive, è possibile specificare l'opzione "/persistPictResults" al prompt dei comandi durante l'esecuzione. Ogni volta che si specifica "/persistPictResults" per il comando, la prima esecuzione eseguirà effettivamente pict.exe e potrebbe richiedere molto tempo, ma tutte le esecuzioni successive useranno i risultati memorizzati nella cache nei casi in cui il modello e il file di inizializzazione sono stati non modificati. Nota: è necessario continuare a specificare "/persistPictResults" per le esecuzioni successive. Qualsiasi esecuzione successiva in cui non viene specificata verrà eliminata la cache dei risultati alla fine dell'esecuzione.

Se i risultati PICT vengono mantenuti e l'uso dei dati memorizzati nella cache è un elemento che si vuole eseguire per impostazione predefinita, è possibile impostarlo come parte della variabile di ambiente te_cmd come illustrato di seguito ed eliminare la necessità di specificarla in ogni esecuzione. Vedere Esecuzione di test per altre informazioni su te_cmd.

set te_cmd = /persistPictResults

I file di risultato memorizzati nella cache vengono archiviati in una cartella denominata "TAEF-PICT" nella directory %temp%, se Te.exe ha accesso o nella directory di esecuzione corrente da cui è stato avviato Te.exe. L'unica volta che si potrebbero avere i risultati in uno stato incoerente è se si preme CTRL + C durante l'esecuzione. In tal caso, TAEF tenterà di eliminare i risultati memorizzati nella cache, ma se non è in grado di farlo, verrà visualizzato un errore per l'effetto. L'errore richiederà di eliminare il percorso dei risultati memorizzato nella cache. La mancata operazione può comportare comportamenti non definiti o errati nei test successivi.

Con il supporto PICT predefinito in TAEF, è ora possibile sfruttare al meglio entrambe le funzionalità in PICT e funzionalità in TAEF nell'automazione dei test.

DataSource come risorsa

È possibile aggiungere modelli PICT e file di seeding come risorse nel modulo di test.

Nel codice nativo, questa operazione viene eseguita specificando il nome della risorsa anziché il nome del file nei metadati di DataSource. Esempio:

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

"MyModelResourceName" e "MySeedingResourceName" sono i nomi delle risorse definiti in un file rc. Il tipo di risorsa deve essere DATAFILE, a differenza delle origini dati di tabella in cui il tipo di risorsa deve essere DATASOURCE_XML.

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

Il valore dei metadati DataSource rimarrà invariato quando il modello era un file. Analogamente nel codice nativo, è possibile creare il nome della risorsa come il nome del file. TAEF cercherà prima di tutto la presenza del file effettivo con il nome DataSource. Se il file non viene trovato, procedere esaminando le risorse del modulo di test. Poiché la modifica dell'origine dati archiviata nella risorsa richiede la ricompilazione, è possibile sfruttare questa progettazione copiando il file DataSource nella stessa posizione della dll di test durante lo sviluppo e la denominazione del nome della risorsa come nome del file. Dopo aver eseguito il test, spostare (non copiare) il file nella directory del codice e ricompilare per incorporare la risorsa.