測試撰寫和執行架構提供強大的平臺,讓您撰寫和執行測試。 瞭解TAEF幕後運作的一些細節,可能有助於充分利用TAEF。 此頁面討論一些秘訣和功能,可協助您撰寫測試,以優化並充分利用TAEF所提供的功能。 請確定您已熟悉使用TAEF撰寫和執行測試的基本概念。
設定 (或初始化) 和清除方法
組件層級的設定和清除方法(也稱為基治具),每次 DLL 執行時都會運行一次。 同樣地,類別層級設定和清除方法會在每個類別執行一次。 測試層級設定和清除方法對於類別內的所有測試都相同,並在類別中的每個測試前後叫用一次。
每個元件只能有一個元件層級的設定和清除方法,每個類別只能有一個類別層級的設定和清除方法,每個類別也只能有一個測試設定和清除方法。 請注意,類別設定和清除方法在Managed程式碼中是靜態的,但在C++程序代碼中不是靜態的。
如果啟用例外狀況(預設案例),則會在第一次驗證呼叫失敗時終止任何方法的執行。 如果您已明確停用以例外狀況為基礎的驗證呼叫(如需詳細資訊,請參閱撰寫測試中的驗證一節),您必須有明確的條件語句,才能在驗證呼叫失敗之後管理控制流程。
在設定方法中發生失敗的情況(無論是透過基於例外的驗證失敗,還是透過設定程序明確返回失敗),後續的測試會被視為「已封鎖」,並如此記錄。 例如,如果您的類別層級安裝程式方法失敗,則 類別中的所有測試方法都會被視為「已封鎖」,而且每個方法都會記錄如下。 除此之外,如果安裝程式方法發生失敗,將不會叫用 Cleanup 方法。
測試方法
不需要明確記錄測試結果。 如果測試中的所有驗證呼叫都成功,測試將會記錄為「已通過」。 在第一次驗證呼叫失敗時,測試方法執行將會終止(除非您明確停用基於例外狀況的驗證呼叫,此情況下則由您的條件語句決定控制流程之後的走向,不過測試仍將標示為「失敗」)。
同樣地,如果您有一個 VERIFY 包裝函式,其依賴於返回類型和成功的判斷標準包裹著輔助方法的調用,您就不需要針對其結果進行明確的檢查和記錄。
指定元數據
元數據查閱是階層式的。 這表示如果您的 select 語句是 /select:“@Priority=2”,而且您的 TestMethod 未指定 Priority,TAEF 會查閱包含它的類別。 如果類別層級元數據未指定,TAEF 會查閱組件層級。
因此,如果您想要讓類別中的所有或大部分測試具有相同的「優先順序」,或說「擁有者」,只要在類別層級指定即可取得。 針對此規則例外狀況的一或幾個測試,您可以明確地在 「TestMethod」 層級提供元數據。 如需詳細資訊,請參閱下列測試:
1 namespace WEX { namespace UnitTests { namespace Samples
2 {
3 //
4 // Declare module level properties
5 //
6 BEGIN_MODULE() //This metadata applies to all the classes and tests in this module or assembly
7 MODULE_PROPERTY(L"GroupOwner", L"SomeGroup")
8 END_MODULE()
9 class PremiumBankAccountTests
10 {
11 //
12 // Declare this class to be a test class with an'advanced' declaration
13 // Use advanced declaration when you want to set metadata on the class
14 //
15 BEGIN_TEST_CLASS(PremiumBankAccountTests) //This metadata applies to all the test in this class
16 TEST_CLASS_PROPERTY(L"Priority", L"2")
17 TEST_CLASS_PROPERTY(L"DevOwner", L"Someone")
18 TEST_CLASS_PROPERTY(L"PMOwner", L"Someone")
19 END_TEST_CLASS()
20 //
21 // Declare class setup - a method that runs after class constructor
22 // and before any test class methods and test setup method
23 //
24 TEST_CLASS_SETUP(SetDefaultAccountType);
25 //
26 // Declare class cleanup - a methods that runs after all the class test methods and test setup method
27 // and before the class destructor
28 //
29 TEST_CLASS_CLEANUP(ResetDefaultAccountType);
30 //
31 // Declare test setup and cleanup - methods that run before and after the execution
32 // of every test method correspondingly
33 //
34 TEST_METHOD_SETUP(CreateBankAccount);
35 TEST_METHOD_CLEANUP(DestroyBankAccount);
36 //
37 // Declare test methods with an 'advanced' declaration
38 // Use advanced declaration when you want to set metadata on the methods
39 //
40 BEGIN_TEST_METHOD(DebitTest)
41 TEST_METHOD_PROPERTY(L"BVT", L"TRUE")
42 TEST_METHOD_PROPERTY(L"PERF", L"TRUE")
43 TEST_METHOD_PROPERTY(L"STRESS", L"FALSE")
44 TEST_METHOD_PROPERTY(L"Priority", L"1") //Overrides the Class level Priority value
45 END_TEST_METHOD()
46 BEGIN_TEST_METHOD(CreditTest)
47 TEST_METHOD_PROPERTY(L"BVT", L"TRUE")
48 TEST_METHOD_PROPERTY(L"PERF", L"FALSE")
49 TEST_METHOD_PROPERTY(L"STRESS", L"TRUE")
50 TEST_METHOD_PROPERTY(L"GroupOwner", L"SomeGroupTest") //Overrides the GroupOwner specified at the Module level
51 END_TEST_METHOD()
52
53 std::unique_ptr<BankAccount> m_spBankAccount;
54 BankAccountType m_defaultType;
55 };
56 } /* namespace Samples */ } /* namespace UnitTests */ } /* namespace WEX */
注意:針對受控測試,撰寫作業會以類似的方式完成。 模組層級與Managed中的元件層級標記相同。 針對托管程式碼中的繼承層級或類別層級元數據規格,必須在靜態初始設定方法之前提供標記。 這可能表示,如果您的測試還沒有初始設定方法,您可能必須提供空的初始設定方法。 此設計特別設計,以確保 VSTS 相容性。
如果是以數據表為基礎的數據驅動測試,您可以進一步進行此步驟,並在數據列層級指定它來覆寫測試層級元數據。 如需詳細資訊,請參閱 元數據覆寫數據驅動測試範例 。