PICT 資料來源
請先確定您已熟悉 TAEF 的基本執行,並瞭解如何使用它撰寫測試,再繼續進行本節。
PICT 背景和參考
PICT 代表配對獨立撰寫式測試。 PICT 可讓您個別指定每個參數的變化。 例如,如果 API 測試相依于兩個參數:FileName 和 FileExtension,您可以考慮針對 FileName 和 FileExtension 個別傳遞的可能變化,如下所示:
- FileName: a, z12390, Realllyreallylong, normallength
- FileExtension:txt、png、bat、doc、exe、bmp、wav
現在,您可以看到上述的 暴力密碼破解組合式擴充 (4 X 7 = 28) 可以輕鬆地脫離界限 ,因為您認為要新增至清單的更多變化。 在這類測試案例中, PICT 可以藉由產生精簡的參數結果集來增加許多價值,以取得輸入參數的完整組合涵蓋範圍。
TAEF 中的 PICT 支援
TAEF 提供 PICT 型測試的內建支援。
若要利用這項功能,請像平常一樣,為pict.exe撰寫您的輸入模型檔案。 請參閱上述範例資料夾中的 *.txt檔案。 嘗試 PICT 是否如預期般在模型檔案上執行,方法是先在命令提示字元中嘗試,如下所示:
pict.exe <model file> [/e:<seed file>]
Pict.exe可供 TAEF 最新版本共用上的其餘二進位檔使用。
您已完成為 PICT 撰寫模型檔案 (和種子檔案) ,並在命令提示字元中針對pict.exe進行驗證,您現在可以標記測試,讓 TAEF 知道它們是 PICT 驅動測試。 如果您熟悉 TAEF 中可用的資料表型資料驅動測試,您會發現這非常類似。
機器碼:
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 };
Managed 程式碼:
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 }
如上述範例所示,您必須將模型檔案的名稱指定為 DataSource。 您必須在模型檔案名前面加上 「pict:」 ,並提供此名稱作為測試方法的 DataSource。 如果是 Managed 測試,就像使用 TAEF 的任何其他資料驅動測試一樣,您必須提供 TestCoNtext 屬性取得和設定方法,並在類別中擁有相同的私人實例。
如果您想要將命令選項傳遞至 PICT,您可以使用中繼資料來進行此用途。 使用下表,將Pict.exe的命令選項對應至 TAEF 中繼資料。
pict.exe命令語法 | 原生 TAEF 中繼資料語法 | Managed 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」) ] |
上述任何中繼資料都可以在命令提示字元、DataSource 屬性中設定,或是以該順序設定為測試、類別或模組層級中繼資料。 若要在命令提示字元中設定它,請使用語法:
te.exe <test dll> /Pict:Order=3 /Pict:SeedingFile=test.seed
若要在 DataSource 屬性中設定中繼資料,請使用問號字元 (?) 接著一組 ampersand 分隔中繼資料名稱 = 中繼資料值組來附加模型檔案名。 使用此方法時,中繼資料名稱的 「Pict:」 前置詞是選擇性的。 範例如下:
TEST_METHOD_PROPERTY(L"DataSource", L"Pict:model.txt?Order=3&CaseSensitive=true&Random=true")
在幕後,TAEF 會提供輸入模型檔案和命令選項給 PICT 並取得結果。 如果 PICT 產生任何錯誤或警告,您會看到這些記錄為 TAEF 的警告。 針對 PICT 產生的每個結果輸出資料列,TAEF 將會重新叫用考慮的測試。
設定 「Pict:RandomSeed」 值會將 「Pict:Random」 的預設值從 false 變更為 true。 如此一來,您可以明確地將 「Pict:Random」 設定為 false,讓 TAEF 忽略 「Pict:RandomSeed」。
允許在模型檔案上執行PICT.exe的預設逾時,指定的種子檔案輸入為 5 分鐘。 如果您的模型檔案更涉及,且需要超過 5 分鐘的時間,PICT.exe才能傳回結果,您可以藉由指定 「Pict:Timeout」 中繼資料,覆寫上述 CPP 範例所示的逾時。 在此範例中,會透過標準 TAEF 逾 時格式指定 1.5 分鐘的逾時。 與其他 PICT 中繼資料一樣,會繼承 「Pict:Timeout」 中繼資料,因此可以針對整個類別或模組指定。
您可以從測試方法及其相關聯的設定和清除方法,在給定調用期間存取資料值,就像使用 TAEF 對資料表型資料驅動測試所做的相同,使用 TestData 類別進行原生程式碼,並使用 TestCoNtext 進行 Managed 程式碼,如下所示:
機器碼:
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 }
Managed 程式碼:
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 }
就像 TAEF 中任何資料驅動測試一樣,「Index」 是保留的,不應當做參數名稱使用。 Index 會隱含地參考測試方法調用的索引,而且如果您的測試需要,可以從測試方法存取。
也請務必注意,如果是 PICT 型測試,所有參數的資料類型會假設為 WEX::Common::String (原生) 、String (Managed) 或VT_BSTR (腳本) 。 轉換和解譯會保留給使用者。
現在您已使用 TAEF 撰寫 PICT 型測試完成,您可以從命令提示字元叫用它,並套用 TAEF 提供給它的所有命令功能:例如 /list ,以取得將使用 PICT 輸出作為資料所產生的所有測試方法清單, /listproperties 以取得測試方法名稱的清單,以及它們相關聯的中繼資料和資料值等。 開始之前要注意的重點是確保pict.exe位於您的路徑中。
以下是一些範例:
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
若要深入瞭解選取準則 (/select 和 /name) 請參閱 Selection wiki 頁面。
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
上述範例示範如何使用索引來選取。 您也可以選擇根據資料值來選取。
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 結果快取
某些模型檔案可能非常複雜,而且可能需要較長的時間才能由Pict.exe處理。 TAEF 會嘗試在指定執行Te.exe期間快取結果,以減輕結果的處理時間。 如果相同執行回合中的後續測試參考相同的模型和種子檔案組合,TAEF 將會使用快取的結果。 根據預設,在每個執行結束時,會刪除快取的結果。
如果您想要繼續利用後續執行的快取結果,您可以在執行期間于命令提示字元中指定 「/persistPictResults」 選項。 每當您為命令指定 「/persistPictResults」 時,第一個執行實際上會執行pict.exe,而且可能需要很長的時間,但所有後續的執行都會在模型和種子檔案未修改的情況下使用快取的結果。 注意:您必須繼續指定後續執行的 「/persistPictResults」。 您未指定的任何後續執行都會在該執行結束時刪除快取的結果。
如果保存 PICT 結果,並使用快取的資料是您想要預設執行的動作,您可以將它設定為te_cmd環境變數的一部分,如下所示,並不需要在每次執行時加以指定。 如需te_cmd的詳細資訊,請參閱 執行測試 。
set te_cmd = /persistPictResults
快取的結果檔案會儲存在 %temp% 目錄中名為 「TAEF-PICT」 的資料夾、如果Te.exe可以存取,或儲存在啟動Te.exe的目前執行目錄中。 只有在執行期間按下 Ctrl + C 時,結果才會處於不一致狀態。 在這種情況下,TAEF 會嘗試刪除快取的結果,但如果無法這麼做,您會看到效果的錯誤。 錯誤會提示您刪除快取的結果位置。 無法執行可能會導致後續測試中未定義或錯誤的行為。
在 TAEF 中使用內建的 PICT 支援,您現在可以充分利用 PICT 中的功能,以及測試自動化中 TAEF 的功能。
DataSource 作為資源
您可以在測試課程模組中新增 PICT 模型和植入檔案作為資源。
在機器碼中,這是藉由指定資源名稱而非 DataSource 中繼資料中的檔案名來完成。 範例如下:
BEGIN_TEST_METHOD(ResourceNameDataSource)
TEST_METHOD_PROPERTY(L"DataSource", L"Pict:MyModelResourceName?SeedingFile=MySeedingResourceName")
END_TEST_METHOD()
「MyModelResourceName」 和 「MySeedingResourceName」 是 .rc 檔案中定義的資源名稱。 資源類型必須是 DATAFILE,不同于需要DATASOURCE_XML資源類型的 資料表資料來源 。
MyModelResourceName DATAFILE "model.txt"
MySeedingResourceName DATAFILE "seed.txt"
DataSource 中繼資料值會維持在模型是檔案時所做的相同。 同樣地,在機器碼中,您可以讓資源名稱與檔案名相同。 TAEF 會先尋找具有 DataSource 名稱的實際檔案是否存在。 如果找不到檔案,請繼續查看測試模組的資源。 由於變更儲存在資源中的 DataSource 需要重新編譯,因此您可以將 DataSource 檔案複製到與測試 dll 相同的位置,同時開發 (並將資源名稱命名為與檔案名相同的) ,以利用此設計。 完成測試之後,請將 (不要複製) 檔案回到程式碼目錄,然後重新編譯以內嵌資源。