PICT-Datenquelle
Stellen Sie sicher, dass Sie mit der grundlegenden Ausführung von TAEF vertraut sind und wissen, wie Sie Tests damit erstellen, bevor Sie mit diesem Abschnitt fortfahren.
PICT-Hintergrund und Verweise
PICT steht für Pairwise Independent Combinatorial Testing. Mit PICT können Sie Variationen für jeden Ihrer Parameter separat angeben. Wenn der API-Test beispielsweise von zwei Parametern abhängt: FileName und FileExtension, können Sie sich die möglichen Variationen für FileName und FileExtensions separat wie folgt vorstellen:
- FileName: a, z12390, Realllyreallyreallylonglong, normallength
- FileExtension: txt, png, bat, doc, exe, bmp, wav
Nun können Sie sehen, dass eine kombinierte Brute-Force-Erweiterung des obigen (4 x 7 = 28) leicht aus den Grenzen geraten kann , wenn Sie an weitere Varianten denken, die der Liste hinzugefügt werden sollen. In solchen Testfallszenarien könnte PICT einen großen Wert hinzufügen, indem ein kompakter Satz von Parameterergebnissen generiert wird, um eine umfassende kombinatorische Abdeckung der Eingabeparameter zu erhalten.
PICT-Unterstützung in TAEF
TAEF bietet integrierte Unterstützung für PICT-basierte Tests.
Um dies zu nutzen, schreiben Sie ihre Eingabemodelldatei für pict.exe wie gewohnt. Weitere Informationen finden Sie in den *.txt-Dateien im oben genannten Beispielordner. Es kann hilfreich sein, zu versuchen, ob PICT wie erwartet in Ihrer Modelldatei ausgeführt wird, indem Sie es zuerst wie folgt an der Eingabeaufforderung versuchen:
pict.exe <model file> [/e:<seed file>]
Pict.exe ist mit den restlichen Binärdateien auf der neuesten Releasefreigabe von TAEF verfügbar.
Wenn Sie die Modelldatei (und die Seeddatei) für PICT erstellt und sie an der Eingabeaufforderung anhand pict.exe überprüft haben, können Sie jetzt Ihre Tests markieren, um TAEF mitzuteilen, dass es sich um PICT-gesteuerte Tests handelt. Wenn Sie mit tabellenbasierten datengesteuerten Tests vertraut sind, die in TAEF verfügbar sind, finden Sie dies sehr ähnlich.
Nativer 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 };
Verwalteter 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 }
Wie in den obigen Beispielen gezeigt, müssen Sie den Namen der Modelldatei als Datenquelle angeben. Sie müssen dem Namen der Modelldatei "pict:" vorangestellt und als DataSource für Ihre Testmethode angeben. Im Fall des verwalteten Tests müssen Sie genau wie bei jedem anderen datengesteuerten Test mit TAEF die Get- und Set-Methoden der TestContext-Eigenschaft bereitstellen und über eine private instance derselben in Ihrer Klasse verfügen.
Wenn Sie Befehlsoptionen an PICT übergeben möchten, können Sie metadaten zu diesem Zweck verwenden. Verwenden Sie die folgende Tabelle, um die Befehlsoptionen von Pict.exe TAEF-Metadaten zuzuordnen.
pict.exe Befehlssyntax | Native TAEF-Metadatensyntax | Verwaltete TAEF-Metadatensyntax |
---|---|---|
/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")] |
Alle oben genannten Metadaten können an der Eingabeaufforderung, in der DataSource-Eigenschaft oder als Metadaten auf Test-, Klassen- oder Modulebene mit Rangfolge in dieser Reihenfolge festgelegt werden. Verwenden Sie die Syntax, um sie an der Eingabeaufforderung festzulegen:
te.exe <test dll> /Pict:Order=3 /Pict:SeedingFile=test.seed
Um Metadaten in der DataSource-Eigenschaft festzulegen, fügen Sie den Namen der Modelldatei mit einem Fragezeichen (?) an, und fügen Sie dann einen Satz von amper- und getrennten Metadatennamen = Metadatenwertpaare an. Bei Verwendung dieser Methode ist das Präfix "Pict:" für Metadatennamen optional. Beispiel:
TEST_METHOD_PROPERTY(L"DataSource", L"Pict:model.txt?Order=3&CaseSensitive=true&Random=true")
Im Hintergrund stellt TAEF Ihre Eingabemodelldatei und Befehlsoptionen für PICT bereit und ruft die Ergebnisse ab. Wenn PICT Fehler oder Warnungen erzeugt, werden diese von TAEF als Warnungen protokolliert. Für jede resultierende Ausgabezeile, die PICT erzeugt, ruft TAEF den betreffenden Test erneut auf.
Durch Festlegen des Werts "Pict:RandomSeed" wird die Standardeinstellung für "Pict:Random" von false in true geändert. Auf diese Weise können Sie "Pict:Random" explizit auf false festlegen, damit TAEF "Pict:RandomSeed" ignoriert.
Das standardmäßig zulässige Timeout für PICT.exe für die Ausführung der Modelldatei und der angegebenen Seeddateieingabe beträgt 5 Minuten. Wenn Ihre Modelldatei stärker involviert ist und mehr als 5 Minuten dauert, bis PICT.exe Ergebnisse zurückgibt, können Sie dieses Timeout wie im obigen CPP-Beispiel gezeigt überschreiben, indem Sie die Metadaten "Pict:Timeout" angeben. Im Beispiel wird ein Timeout von 1,5 Minuten über das TAEF-Standardtimeoutformat angegeben. Wie die anderen PICT-Metadaten werden die "Pict:Timeout"-Metadaten geerbt und können daher für die gesamte Klasse oder das gesamte Modul angegeben werden.
Sie können während eines bestimmten Aufrufs von Ihrer Testmethode und den zugehörigen Setup- und Bereinigungsmethoden auf die gleiche Weise wie bei tabellenbasierten datengesteuerten Tests mit TAEF zugreifen– indem Sie die TestData-Klasse für nativen Code verwenden und testContext für verwalteten Code wie folgt verwenden:
Nativer 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 }
Verwalteter 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 }
Genau wie bei allen datengesteuerten Tests in TAEF ist "Index" reserviert und sollte nicht als Parametername verwendet werden. Index bezieht sich implizit auf den Index des Testmethodenaufrufs und ist von der Testmethode aus zugänglich, wenn ihr Test dies benötigt.
Es ist auch wichtig zu beachten, dass bei PICT-basierten Tests der Datentyp für alle Parameter als WEX::Common::String (nativ), String(verwaltet) oder VT_BSTR(script) angenommen wird. Die Konvertierung und Interpretation bleibt dem Benutzer überlassen.
Nachdem Sie nun den PICT-basierten Test mithilfe von TAEF erstellt haben, können Sie ihn über die Eingabeaufforderung aufrufen und alle Befehlsfeatures, die TAEF bietet, darauf anwenden: wie /list , um eine Liste aller Testmethoden abzurufen, die mithilfe der PICT-Ausgabe als Daten generiert werden, /listEigenschaften , um eine Liste der Testmethodennamen zusammen mit den Metadaten und Datenwerten abzurufen, denen sie zugeordnet sind. Etc. Bevor Sie beginnen, sollten Sie sicherstellen, dass sich pict.exe in Ihrem Pfad befindet.
Hier sind einige Beispiele:
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
Weitere Informationen zu Auswahlkriterien (/select und /name) finden Sie auf der Wiki-Seite Auswahl.
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
Das obige Beispiel zeigt, wie Sie mithilfe des Indexes auswählen können. Sie können auch basierend auf dem Datenwert auswählen.
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-Ergebniszwischenspeicherung
Einige Modelldateien werden möglicherweise sehr komplex und benötigen möglicherweise längere Zeit, um von Pict.exe verarbeitet zu werden. TAEF versucht, die Verarbeitungszeit für Ergebnisse zu verringern, indem ergebnisse während einer bestimmten Ausführung von Te.exe zwischengespeichert werden. Wenn sich ein nachfolgender Test in derselben Ausführungsausführung auf dieselbe Modell- und Seeddateikombination bezieht, verwendet TAEF die zwischengespeicherten Ergebnisse. Standardmäßig werden am Ende jeder Ausführung die zwischengespeicherten Ergebnisse gelöscht.
Wenn Sie die zwischengespeicherten Ergebnisse in nachfolgenden Ausführungen weiterhin nutzen möchten, können Sie während der Ausführung an der Eingabeaufforderung die Option "/persistPictResults" angeben. Wenn Sie "/persistPictResults" für Ihren Befehl angeben, wird die erste Ausführung tatsächlich pict.exe ausgeführt und kann lange dauern, aber alle nachfolgenden Ausführungen verwenden die zwischengespeicherten Ergebnisse, wenn das Modell und die Seeddatei unverändert sind. Hinweis: Sie müssen die Angabe von "/persistPictResults" für nachfolgende Ausführungen fortsetzen. Jede nachfolgende Ausführung, bei der Sie sie nicht angeben, löscht die zwischengespeicherten Ergebnisse am Ende dieser Ausführung.
Wenn Sie die PICT-Ergebnisse beibehalten und zwischengespeicherte Daten standardmäßig verwenden möchten, können Sie sie wie unten gezeigt als Teil Der umgebungsvariablen te_cmd festlegen, damit sie bei jeder Ausführung nicht mehr angegeben werden muss. Weitere Informationen zu te_cmd finden Sie unter Ausführen von Tests .
set te_cmd = /persistPictResults
Die zwischengespeicherten Ergebnisdateien werden in einem Ordner namens "TAEF-PICT" im Verzeichnis %temp% gespeichert, wenn Te.exe Zugriff darauf hat, oder im aktuellen Ausführungsverzeichnis, von dem aus Te.exe gestartet wurde. Das einzige Mal, wenn Sie die Ergebnisse in einem inkonsistenten Zustand haben, ist, wenn Sie während der Ausführung STRG+C drücken. In einem solchen Fall versucht TAEF, die zwischengespeicherten Ergebnisse zu löschen, aber wenn dies nicht möglich ist, wird ein Fehler angezeigt. Der Fehler fordert Sie auf, den zwischengespeicherten Ergebnisspeicherort zu löschen. Andernfalls kann es bei nachfolgenden Tests zu nicht definierten oder fehlerhaften Verhaltensweisen führen.
Mit der integrierten PICT-Unterstützung in TAEF können Sie jetzt sowohl die Features in PICT als auch die Features in TAEF in Ihrer Testautomatisierung optimal nutzen.
DataSource als Ressource
Sie können PICT-Modelle und Seedingdateien als Ressourcen in Ihrem Testmodul hinzufügen.
Im systemeigenen Code erfolgt dies durch Angabe des Ressourcennamens anstelle des Dateinamens in den DataSource-Metadaten. Beispiel:
BEGIN_TEST_METHOD(ResourceNameDataSource)
TEST_METHOD_PROPERTY(L"DataSource", L"Pict:MyModelResourceName?SeedingFile=MySeedingResourceName")
END_TEST_METHOD()
"MyModelResourceName" und "MySeedingResourceName" sind die Ressourcennamen, die in einer RC-Datei definiert sind. Der Ressourcentyp muss DATAFILE sein, im Gegensatz zu Tabellendatenquellen , bei denen der Ressourcentyp DATASOURCE_XML werden muss.
MyModelResourceName DATAFILE "model.txt"
MySeedingResourceName DATAFILE "seed.txt"
Der DataSource-Metadatenwert bleibt identisch mit dem Wert, als es sich bei dem Modell um eine Datei handelte. Ebenso können Sie im nativen Code festlegen, dass der Ressourcenname mit dem Dateinamen identisch ist. TAEF sucht zuerst nach dem Vorhandensein der tatsächlichen Datei mit dem DataSource-Namen. Wenn die Datei nicht gefunden wird, suchen Sie in den Ressourcen des Testmoduls. Da das Ändern der in der Ressource gespeicherten Datenquelle eine erneute Kompilierung erfordert, können Sie diesen Entwurf nutzen, indem Sie die DataSource-Datei während der Entwicklung an denselben Speicherort wie die Test-DLL kopieren (und den Ressourcennamen mit dem Dateinamen identisch nennen). Nachdem Sie mit dem Testen fertig sind, verschieben (nicht kopieren) Sie die Datei zurück in das Codeverzeichnis, und kompilieren Sie erneut, um die Ressource einzubetten.