Delen via


PICT-gegevensbron

Zorg ervoor dat u bekend bent met de basisuitvoering van TAEF en weet hoe u tests kunt schrijven die deze gebruiken, voordat u doorgaat met deze sectie.

PICT-achtergrond en -verwijzingen

PICT staat voor Pairwise Independent Combinatorial Testing. Met PICT kunt u variaties voor elk van uw parameters afzonderlijk opgeven. Als de API-test bijvoorbeeld afhankelijk is van twee parameters: FileName en FileExtension, kunt u de mogelijke variaties bedenken die moeten worden doorgegeven voor FileName en voor FileExtensions:

  • Bestandsnaam: a, z12390, Realllyreallyreallylonglonglonglonglonglonglonglonglonglong, normallength
  • FileExtension: txt, png, bat, doc, exe, bmp, wav

U kunt nu zien dat een brute-force combinatoriële uitbreiding van de bovenstaande (4 X 7 = 28) gemakkelijk buiten de grenzen kan komen als u meer variaties vindt om aan de lijst toe te voegen. In dergelijke testscenario's kan PICT veel waarde toevoegen door een compacte set parameterresultaten te genereren om uitgebreide combinatoriële dekking te krijgen over de invoerparameters.

PICT-ondersteuning in TAEF

TAEF biedt ingebouwde ondersteuning voor op PICT gebaseerde tests.

Als u hiervan gebruik wilt maken, schrijft u het invoermodelbestand voor pict.exe zoals u normaal zou doen. Raadpleeg de *.txt bestanden in de bovenstaande map met voorbeelden. Het kan handig zijn om te proberen of PICT wordt uitgevoerd zoals verwacht in uw modelbestand door het eerst te proberen bij de opdrachtprompt:

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

Pict.exe is beschikbaar samen met de andere binaire bestanden in de nieuwste release van TAEF.

U bent klaar met het ontwerpen van uw modelbestand (en seed-bestand) voor PICT en hebt dit gecontroleerd op pict.exe bij de opdrachtprompt. U kunt nu uw tests markeren om TAEF te laten weten dat het PICT-gestuurde tests zijn. Als u bekend bent met gegevensgestuurde tests op basis van tabellen die beschikbaar zijn in TAEF, zult u dit zeer vergelijkbaar vinden.

Systeemeigen code

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

Beheerde code:

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    }

Zoals wordt weergegeven in de bovenstaande voorbeelden, moet u de naam van het modelbestand opgeven als de gegevensbron. U moet de naam van het modelbestand vooraf laten gaan door 'pict:' en deze op te geven als de DataSource voor uw testmethode. In het geval van de beheerde test, net als bij elke andere gegevensgestuurde test met TAEF, moet u de eigenschap TestContext ophalen en methoden instellen en een privé-exemplaar van hetzelfde in uw klasse hebben.

Als u opdrachtopties wilt doorgeven aan PICT, kunt u hiervoor metagegevens gebruiken. Gebruik de volgende tabel om de opdrachtopties van Pict.exe toe te wijzen aan TAEF-metagegevens.

pict.exe opdrachtsyntaxis Syntaxis van systeemeigen TAEF-metagegevens Syntaxis van beheerde TAEF-metagegevens
/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")]

Een van de bovenstaande metagegevens kan worden ingesteld bij de opdrachtprompt, in de eigenschap DataSource, of als metagegevens op test-, klasse- of moduleniveau, met prioriteit in die volgorde. Gebruik de syntaxis om deze in te stellen bij de opdrachtprompt:

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

Als u metagegevens wilt instellen in de eigenschap DataSource, plaatst u achter de bestandsnaam van het model een vraagteken (?) gevolgd door een reeks met ampersand gescheiden paren van metagegevensnamen en metagegevenswaarden. Wanneer u deze methode gebruikt, is het voorvoegsel Pict:voor metagegevensnamen optioneel. Hier volgt een voorbeeld:

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

Achter de schermen levert TAEF uw invoermodelbestand en opdrachtopties aan PICT en haalt u de resultaten op. Als PICT fouten of waarschuwingen produceert, ziet u deze als waarschuwingen van TAEF. Voor elke resulterende uitvoerrij die PICT produceert, zal TAEF de betreffende test opnieuw aanroepen.

Als u de waarde 'Pict:RandomSeed' instelt, wordt de standaardwaarde voor Pict:Random gewijzigd van false in true. Op deze manier kunt u 'Pict:Random' expliciet instellen op false om TAEF te laten negeren "Pict:RandomSeed".

De standaard time-outperiode die is toegestaan voor de uitvoering van PICT.exe op het modelbestand en de opgegeven invoer voor het seed-bestand, is vijf minuten. Als uw modelbestand meer betrokken is en meer tijd nodig heeft dan 5 minuten voordat PICT.exe resultaten retourneert, kunt u deze time-out overschrijven, zoals wordt weergegeven in het bovenstaande CPP-voorbeeld door de metagegevens 'Pict:Timeout' op te geven. In het voorbeeld wordt een time-out van 1,5 minuten opgegeven via het standaard TAEF Time-out formaat. Net als de andere PICT-metagegevens worden de metagegevens Pict:Timeout overgenomen en kunnen daarom worden opgegeven voor de hele klasse of module.

U kunt toegang krijgen tot de gegevenswaarden tijdens een bepaalde aanroep vanuit uw testmethode en de bijbehorende installatie- en opschoonmethoden op dezelfde manier als voor op tabellen gebaseerde gegevensgestuurde tests met TAEF- met behulp van de Klasse TestData voor systeemeigen code en het gebruik van TestContext voor beheerde code als volgt:

Systeemeigen code

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    }

Beheerde code:

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    }

Net als bij gegevensgestuurde tests in TAEF is 'Index' gereserveerd en mag deze niet worden gebruikt als parameternaam. Index verwijst impliciet naar de index van de aanroep van de testmethode en is toegankelijk vanuit de testmethode als uw test deze nodig heeft.

Het is ook belangrijk te weten dat in het geval van op PICT gebaseerde tests het gegevenstype voor alle parameters wordt verondersteld WEX:::Common::String (native), String(managed) of VT_BSTR(script) te zijn. De conversie en interpretatie worden aan de gebruiker overgelaten.

Nu u klaar bent met het ontwerpen van de op PICT gebaseerde test met behulp van TAEF, kunt u deze aanroepen vanaf de opdrachtprompt en alle opdrachtfuncties toepassen die TAEF biedt: zoals /list om een lijst op te halen met alle testmethoden die worden gegenereerd met behulp van de PICT-uitvoer als gegevens, /listproperties om een lijst op te halen met de namen van de testmethode, samen met de metagegevens en gegevenswaarden waaraan ze zijn gekoppeld enz. Het belangrijkste dat u moet noteren voordat u begint, is om ervoor te zorgen dat pict.exe zich in uw pad bevindt.

Enkele voorbeelden:

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

Raadpleeg de wikipagina Selectie voor meer informatie over selectiecriteria (/select en /name).

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

In het bovenstaande voorbeeld ziet u hoe u deze kunt selecteren met behulp van de index. U kunt er ook voor kiezen om te selecteren op basis van de gegevenswaarde.

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

PICT Result Caching

Sommige modelbestanden worden mogelijk erg complex en vereisen mogelijk langere tijd om te worden verwerkt door Pict.exe. TAEF probeert de verwerkingstijd voor resultaten te beperken door resultaten in de cache te plaatsen tijdens een bepaalde uitvoering van Te.exe. Als een volgende test in dezelfde uitvoeringsuitvoering verwijst naar dezelfde combinatie van model- en seed-bestanden, gebruikt TAEF de resultaten in de cache. Aan het einde van elke uitvoering worden de resultaten in de cache standaard verwijderd.

Als u wilt blijven profiteren van de resultaten in de cache in volgende uitvoeringen, kunt u tijdens de uitvoering de optie '/persistPictResults' opgeven bij de opdrachtprompt. Wanneer u '/persistPictResults' opgeeft voor uw opdracht, wordt de eerste uitvoering daadwerkelijk uitgevoerd pict.exe en kan het lang duren, maar alle volgende uitvoeringen gebruiken de resultaten in de cache in gevallen waarin het model en het seed-bestand ongewijzigd zijn gebleven. Opmerking: u moet doorgaan met het opgeven van '/persistPictResults' voor volgende uitvoeringen. Bij elke volgende uitvoering waarbij u het niet specificeert, worden de resultaten in de cache aan het einde van die uitvoering verwijderd.

Als u de PICT-resultaten blijft behouden en gegevens in de cache wilt gebruiken, kunt u deze instellen als onderdeel van uw te_cmd omgevingsvariabele, zoals hieronder wordt weergegeven en hoeft u deze niet op te geven bij elke uitvoering. Zie Tests uitvoeren voor meer informatie over te_cmd.

set te_cmd = /persistPictResults

De in de cache opgeslagen resultaatbestanden worden opgeslagen in een map met de naam TAEF-PICT in %temp% map, als Te.exe er toegang toe heeft, of in de huidige uitvoeringsmap van waaruit Te.exe is gestart. De enige keer dat u de resultaten in een inconsistente status hebt, is als u tijdens de uitvoering op Ctrl+C drukt. In een dergelijk geval probeert TAEF de resultaten in de cache te verwijderen, maar als dit niet lukt, ziet u een foutmelding. De fout vraagt u om de locatie van de resultaten in de cache te verwijderen. Als u dit niet doet, kan dit leiden tot niet-gedefinieerd of onjuist gedrag in volgende tests.

Met ingebouwde PICT-ondersteuning in TAEF kunt u nu optimaal gebruikmaken van beide functies, functies in PICT en functies in TAEF in uw testautomatisering.

DataSource als een hulpbron

U kunt PICT-modellen en seeding-bestanden toevoegen als resources in uw testmodule.

In systeemeigen code wordt dit gedaan door de resourcenaam op te geven in plaats van de bestandsnaam in de metagegevens van datasource. Hier volgt een voorbeeld:

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

'MyModelResourceName' en 'MySeedingResourceName' zijn de resourcenamen die zijn gedefinieerd in een RC-bestand. Het resourcetype moet DATAFILE zijn, in tegenstelling tot in tabelgegevensbronnen waarin het resourcetype moet worden DATASOURCE_XML.

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

De waarde voor metagegevens van DataSource blijft hetzelfde als toen het model een bestand was. Op dezelfde manier kunt u in systeemeigen code de resourcenaam gelijk maken aan de bestandsnaam. TAEF zoekt eerst naar de aanwezigheid van het werkelijke bestand met de naam van de gegevensbron. Als het bestand niet wordt gevonden, gaat u verder met het zoeken naar de resources van de testmodule. Omdat het wijzigen van de DataSource die in de resource is opgeslagen, opnieuw moet worden gecompileerd, kunt u dit ontwerp gebruiken door het DataSource-bestand te kopiëren naar dezelfde locatie als het test-DLL-bestand tijdens het ontwikkelen (en de naam van de resource moet dezelfde naam hebben als de bestandsnaam). Zodra u klaar bent met testen, verplaatst u het bestand (niet kopiëren) terug naar de codemap en compileert u het opnieuw om de resource in te sluiten.