充分利用 TAEF

测试创作和执行框架提供了一个强大的平台来创作和执行测试。 为了充分利用 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 兼容性而制作的。

对于基于表的数据驱动测试,可以进一步执行此步骤,通过在行级别指定测试级别元数据来替代测试级别元数据。 有关详细信息 ,请参阅元数据替代数据驱动测试示例