测试创作和执行框架提供了一个强大的平台来创作和执行测试。 为了充分利用 TAEF,了解一些幕后功能细节可能很有帮助。 本页讨论一些提示和功能,这些提示和功能将帮助你创作测试,以优化和充分利用 TAEF 所提供的功能。 请确保熟悉使用 TAEF 创作和执行测试的基础知识。
设置 (或初始化) 和清理方法
程序集级别的设置和清理方法 (也称为 ) 的固定例程 ,每次 DLL 执行时运行一次。 同样,每个类运行一次类级别的设置和清理方法。 测试级别设置和清理方法对于类中的所有测试都是相同的,在类中的每个测试之前和之后调用一次。
每个程序集可能只有一个程序集级设置和清理方法,每个类只能有一个类级安装和清理方法,每个类只能有一个测试安装和清理方法。 请注意,类设置和清理方法在托管代码中是静态的,但在 C++ 代码中不是静态的。
如果 (默认情况) 启用异常,则任何方法的执行将在第一次验证调用失败时终止。 如果显式禁用了基于异常的 Verify 调用 (请参阅创作测试中的 Verify 部分,了解) 的详细信息,则需要在 Verify 调用失败后使用显式条件语句来管理控制流。
如果通过基于异常的验证失败或安装程序显式返回故障) 在 Setup 方法中 (失败,则后续测试被视为“已阻止”并按此类方式记录。 例如,如果类级别安装程序方法失败,则类中的所有测试方法都被视为“已阻止”,并且每个测试方法都将记录为此类方法。 除此之外,如果安装方法中发生故障,则不会调用 Cleanup 方法。
测试方法
不需要显式记录测试结果。 如果测试中的所有 Verify 调用都成功,测试将记录为“已通过”。 在第一次验证调用失败时,测试方法执行将终止 (,除非显式禁用了基于异常的 Verify 调用 - 在这种情况下,条件语句将确定之后的控制流,但不管以下情况) ,测试将标记为“失败”。
同样,如果有 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 */
注意:对于托管测试,创作方式类似。 模块级别与托管中的程序集级别标记相同。 对于托管代码中的程序集级别或类级元数据规范,必须在静态 Initializer 方法之前提供标记。 这可能意味着,如果测试还没有空初始值设定项,则可能必须提供一个空的初始值设定项。 此设计是专门为确保 VSTS 兼容性而制作的。
对于基于表的数据驱动测试,可以进一步执行此步骤,通过在行级别指定测试级别元数据来替代测试级别元数据。 有关详细信息 ,请参阅元数据替代数据驱动测试示例 。