TAEF を最大限に活用する
テスト作成と実行フレームワークには、テストを作成して実行するための強力なプラットフォームが用意されています。 TAEF を最大限に活用するために、TAEF のバックグラウンドの機能を理解しておくことが有益な場合があります。 このページでは、TAEF が提供する機能を最適化して最大限に活用するためのテストの作成に役立つヒントと機能について説明します。 TAEF を使用したテストの作成と実行の基本を理解しているか確認してください。
セットアップ (または初期化) とクリーンアップのメソッド
アセンブリ レベル (フィクスチャとも呼ばれます) のセットアップとクリーンアップの方法は、DLL の実行ごとに 1 回実行されます。 同様に、クラス レベルのセットアップとクリーンアップのメソッドは、クラスごとに 1 回実行されます。 テスト レベルのセットアップとクリーンアップのメソッドは、クラス内のすべてのテストで同じであり、クラス内のすべてのテストの前後に 1 回呼び出されます。
アセンブリごとに 1 つのアセンブリ レベルのセットアップとクリーンアップ メソッド、クラスごとに 1 つのクラス レベルのセットアップと クリーンアップメソッド、およびクラスごとに 1 つのテスト セットアップとクリーンアップ メソッドがあります。 クラスのセットアップ メソッドと クリーンアップ メソッドはマネージド コードでは静的ですが、C++ コードでは静的ではないことに注意してください。
例外が有効になっている場合 (既定の場合)、どのメソッドも、最初に失敗した確認の呼び出しで実行が終了します。 例外ベースの確認呼び出しを明示的に無効にした場合 (詳細については、「テストの作成」の「検証」セクションを参照)、確認呼び出しが失敗した後に制御フローを制御するための明示的な条件付きステートメントが必要です。
セットアップ メソッドでエラーが発生した場合 (例外ベースの確認エラーを使用するか、または失敗を明示的に返すセットアップによって)、それに続くテストは「ブロックされた」とみなされ、そのように記録されます。 たとえば、クラス レベルのセットアップ メソッドが失敗した場合、クラス内のすべてのテスト メソッドは「ブロックされた」とみなされ、それぞれがそのように記録されます。 また、セットアップ メソッドでエラーが発生した場合、クリーンアップ メソッドは呼び出されません。
テスト メソッド
テスト結果を明示的にログに記録する必要はありません。 テスト内のすべての確認呼び出しが成功した場合、テストは「合格」としてログに記録されます。 最初の失敗した確認呼び出しでは、テスト メソッドの実行が終了し (例外ベースの確認呼び出しを明示的に無効にしている場合を除きます。その場合は、条件付きステートメントによってその後の制御フローが決定されますが、それとは関係なく、以下が保持されます)、テストは「失敗」とマークされます。
同様に、ヘルパー メソッド呼び出しに関する確認ラッパー (戻り値の型と成功を決定するものによって異なります) がある場合は、明示的にチェックしてその結果をログに記録する必要はありません。
メタデータの指定
メタデータ参照は階層型です。 つまり、SELECT文が /select:"@Priority=2" で、TestMethod で優先度が指定されていない場合、TAEF はそのステートメントを含むクラスを検索します。 クラス レベルのメタデータで指定されていない場合、TAEF はアセンブリ レベルを検索します。
そのため、クラス内のテストのすべてまたは大部分に同じ「優先度」を設定する場合、または「所有者、クラス レベルで指定するだけで取得できます」となります。 この規則の例外である 1 つまたは少数のテストでは、「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 */
注: マネージド テストの場合、作成も同様に行われます。 モジュール レベルは、マネージドでのアセンブリ レベルのマークアップと同じです。 マネージド コードのアセンブリ レベルまたはクラス レベルのメタデータ仕様の場合は、静的初期化子メソッドの前にマークアップを指定する必要があります。 テストに空の初期化子がない場合は、空の初期化子を指定する必要がある可能性があります。 この設計は、VSTS の互換性を確保するために特別に作成されています。
テーブル ベースのデータ ドリブン テストの場合は、この手順をさらに進め、行レベルで指定することでテスト レベルのメタデータをオーバーライドできます。 詳細は、メタデータ オーバーライド データドリブンテスト例 を参照してください。