验证框架

为了更轻松地编写测试,TAEF 提供了“验证”框架,该框架利用 WexLogger 以最少的代码量报告详细日志。 验证框架可帮助测试提供结构化日志输出 - 如果给定的验证成功,它将输出成功的日志,并在验证失败时输出详细信息。

使用从 C++ 验证

验证 API 在 C++ 中显示为一组宏,这些宏在“Verify.h”头文件中定义 (注意:无需显式包含 Verify.h,应包含“WexTestClass.h”,其中包含标记 C++ 测试以及与 Verify 和 WexLogger API) 交互所需的一切。

以下验证宏是否可用于本机 C++ 测试:

功能
VERIFY_ARE_EQUAL (预期、实际、[可选消息]) 验证两个指定的对象是否相等。 此外,还会记录自定义消息(如果提供)。
VERIFY_ARE_NOT_EQUAL (预期、实际、[可选消息]) 验证两个指定的对象是否不相等。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_GREATER_THAN (expectedGreater、expectedLess、[可选消息]) 验证第一个参数是否大于第二个参数。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_GREATER_THAN_OR_EQUAL (expectedGreater、expectedLess、[可选消息]) 验证第一个参数是否大于或等于第二个参数。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_LESS_THAN (expectedLess、expectedGreater、[可选消息]) 验证第一个参数是否小于第二个参数。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_LESS_THAN_OR_EQUAL (expectedLess、expectedGreater、[可选消息]) 验证第一个参数是否小于或等于第二个参数。 此外,还会记录自定义消息(如果提供)。
VERIFY_ARE_SAME (预期、实际、[可选消息]) 验证指定的两个参数是否引用同一对象。 此外,还会记录自定义消息(如果提供)。
VERIFY_ARE_NOT_SAME (预期、实际、[可选消息]) 验证指定的两个参数是否不引用同一对象。 此外,还会记录自定义消息(如果提供)。
VERIFY_FAIL ([可选消息]) 未检查任何条件而失败。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_TRUE (条件,[可选消息]) 验证指定的布尔值是否为 true。 呼叫VERIFY_IS_TRUE (!!__condition) 或VERIFY_WIN32_BOOL_SUCCEEDED (__condition) 测试 Win32 BOOL。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_FALSE (条件,[可选消息]) 验证指定的布尔值是否为 false。 呼叫VERIFY_IS_FALSE (!!__condition) 或VERIFY_WIN32_BOOL_FAILED (__condition) 来测试 Win32 BOOL。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_NULL (对象,[可选消息]) 验证指定的参数是否为 NULL。 此外,还会记录自定义消息(如果提供)。
VERIFY_IS_NOT_NULL (对象,[可选消息]) 验证指定的参数是否不为 NULL。 此外,还会记录自定义消息(如果提供)。
VERIFY_SUCCEEDED (hresult,[可选消息]) 验证指定的 HRESULT 是否成功。 此外,还会记录自定义消息(如果提供)。
VERIFY_SUCCEEDED_RETURN (hresult,[可选消息]) 验证指定的 HRESULT 是否成功,并返回传递到宏中的 HRESULT。 此外,还会记录自定义消息(如果提供)。
VERIFY_FAILED (hresult,[可选消息]) 验证指定的 HRESULT 是否未成功。 此外,还会记录自定义消息(如果提供)。
VERIFY_FAILED_RETURN (hresult,[可选消息]) 验证指定的 HRESULT 是否不成功,并返回传递到宏中的 HRESULT。 此外,还会记录自定义消息(如果提供)。
VERIFY_THROWS (操作,异常,[可选消息]) 验证指定的操作是否引发给定的异常类型。 此外,还会记录自定义消息(如果提供)。
VERIFY_NO_THROW (操作,[可选消息]) 验证指定的操作不会引发异常。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_SUCCEEDED (win32Result,[可选消息]) 验证指定的 Win32 结果是否成功。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_SUCCEEDED_RETURN (win32Result,[可选消息]) 验证指定的 Win32 结果是否成功,并返回传递到宏中的 LONG。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_FAILED (win32Result,[可选消息]) 验证指定的 Win32 结果是否失败。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_FAILED_RETURN (win32Result,[可选消息]) 验证指定的 Win32 结果是否失败,并返回传递到宏中的 LONG。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_BOOL_SUCCEEDED (win32Bool,[可选消息]) 验证指定的 Win32 BOOL 是否成功 (!= FALSE) 。 如果验证失败,将记录 GetLastError () 的结果。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_BOOL_SUCCEEDED_RETURN (win32Bool,[可选消息]) 验证指定的 Win32 BOOL 是否成功 (!= FALSE) 并返回传递到宏中的 BOOL。 如果验证失败,将记录 GetLastError () 的结果。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_BOOL_FAILED (win32Bool,[可选消息]) 验证指定的 Win32 BOOL 是否失败 (== FALSE) 。 不记录 GetLastError () 的结果。 此外,还会记录自定义消息(如果提供)。
VERIFY_WIN32_BOOL_FAILED_RETURN (win32Bool,[可选消息]) 验证指定的 Win32 BOOL (== FALSE) 失败,并返回传递到宏中的 BOOL。 不记录 GetLastError () 的结果。 此外,还会记录自定义消息(如果提供)。

基于异常的验证用法

如果源代码是在 (启用 C++ 异常的情况下编译的,方法是在源文件) 指定“/EHsc”命令行开关或“USE_NATIVE_EH=1”宏,则 Verify 宏将默认记录失败时的错误,然后引发本机 C++ 异常。 引发的异常是 WEX::TestExecution::VerifyFailureException。 无需捕获此异常 - TAEF 框架将捕获它并转到下一个测试用例。

(可选)如果要在一行中执行一系列验证,而不是在第一次验证失败时中止测试,可以使用 DisableVerifyExceptions 类。 对象的生存期控制禁用异常的时间量。

if (NULL != m_key)
{
    DisableVerifyExceptions disable;
    VERIFY_WIN32_SUCCEEDED(::RegDeleteKey(HKEY_CURRENT_USER, zTempName));
    VERIFY_WIN32_SUCCEEDED(::RegCloseKey(m_key));
}

在上面的示例中,仅在“如果 (NULL != m_key) ”块中禁用异常,并且如果第一个验证调用失败,则仍进行第二个验证调用。

DisableVerifyExceptions 类是引用计数的,并且也基于每个线程运行。

基于非异常的验证用法

如果未在启用 C++ 异常 的情况下编译源代码 ,则验证宏在验证失败时不会引发本机 C++。 此外,如果源代码是在启用 C++ 异常的情况下编译的,但你想要禁用“验证异常”,只需在包含“WexTestClass.h”之前#define NO_VERIFY_EXCEPTIONS。

在此模型中,必须执行一系列嵌套的 if 语句来控制测试用例的流,而不是依赖于 C++ 异常。

if (VERIFY_WIN32_SUCCEEDED(::RegDeleteKey(HKEY_CURRENT_USER, zTempName)))
{
    ...
}

验证输出设置

如果要自定义 Verify API 生成的输出,可以使用 SetVerifyOutput 类。 对象的生存期控制设置输出设置的时间量。 SetVerifyOutput 类经过引用计数,并按线程运行。

if (NULL != m_key)
{
    SetVerifyOutput verifySettings(VerifyOutputSettings::LogOnlyFailures);
    VERIFY_IS_TRUE(true, L"Should NOT log a comment");
    VERIFY_IS_TRUE(false, L"Should log an error");
}
VERIFY_IS_TRUE(true, L"Should log a comment");

在上面的示例中,指定的设置仅与在“if (NULL != m_key) ”块中进行的调用相关,并且 只会 记录失败的验证调用。 但是,即使第三次验证调用成功,也会记录该调用。 这是因为 SetVerifyOutput 类已超出了范围。

存在以下用于设置验证输出的选项:

VerifyOutputSettings::LogOnlyFailures
只会记录失败的验证调用;将忽略所有成功的调用。

VerifyOutputSettings::LogFailuresAsBlocked
将所有失败记录为已阻止,而不是记录错误。

VerifyOutputSettings::LogFailuresAsWarnings
将所有失败记录为警告,而不是记录错误。

VerifyOutputSettings::LogValuesOnSuccess
记录传入的参数的值,即使验证调用成功也是如此。

验证输出设置是否可以将 OR 组合在一起以启用多个设置:

SetVerifyOutput verifySettings(VerifyOutputSettings::LogOnlyFailures | VerifyOutputSettings::LogFailuresAsBlocked);

为自定义类型提供值输出

C++ Verify 框架提供为任何自定义类型生成详细输出的功能。 为此,必须实现 WEX::TestExecution::VerifyOutputTraits 类模板的专用化。

WEX::TestExecution::VerifyOutputTraits 类模板专用化必须存在于 WEX::TestExecution 命名空间中。 它还应提供名为 ToString 的公共静态方法,该方法将引用类,并返回包含其值的字符串表示形式的 WEX::Common::NoThrowString

    class MyClass
    {
    public:
        MyClass(int value)
            : m_myValue(value)
        {
        }

        int GetValue()
        {
            return m_myValue;
        }

    private:
        int m_myValue;
    }

    namespace WEX { namespace TestExecution
    {
        template <>
        class VerifyOutputTraits<MyClass>
        {
        public:
            static WEX::Common::NoThrowString ToString(const MyClass& myClass)
            {
                return WEX::Common::NoThrowString().Format(L"%d", myClass.GetValue());
            }
        };
    }}

为自定义类型提供比较器

C++ Verify 框架提供为未实现相应运算符重载的自定义类型定义比较器的功能, (operator=, operator< 等) 。 为此,必须实现 WEX::TestExecution::VerifyCompareTraits 类模板的专用化。

WEX::TestExecution::VerifyCompareTraits 类模板专用化必须存在于 WEX::TestExecution 命名空间中。 它还应提供名为 AreEqualAreSameIsLessThanIsGreaterThanIsNull 的公共静态方法。

    class MyClass
    {
    public:
        MyClass(int value)
            : m_myValue(value)
        {
        }

        int GetValue()
        {
            return m_myValue;
        }

    private:
        int m_myValue;
    }

    namespace WEX { namespace TestExecution
    {
        template <>
        class VerifyCompareTraits<MyClass, MyClass>
        {
        public:
            static bool AreEqual(const MyClass& expected, const MyClass& actual)
            {
                return expected.GetValue() == actual.GetValue();
            }

            static bool AreSame(const MyClass& expected, const MyClass& actual)
            {
                return &expected == &actual;
            }

            static bool IsLessThan(const MyClass& expectedLess, const MyClass& expectedGreater)
            {
                return (expectedLess.GetValue() < expectedGreater.GetValue());
            }

            static bool IsGreaterThan(const MyClass& expectedGreater, const MyClass& expectedLess)
            {
                return (expectedGreater.GetValue() > expectedLess.GetValue());
            }

            static bool IsNull(const MyClass& object)
            {
                return object.GetValue() == 0;
            }
        };
    }}

使用从 C 验证#

C# Verify 用法类似于 C++ 的用法。 但是,它通过 WEX 提供。TestExecution.Verify 类,它位于 Te.Managed.dll

以下 Verify 方法可用于 C# 测试:

功能
应为 AreEqual (对象,对象实际) 验证两个指定的对象是否相等。
应为 AreEqual (对象,对象实际,字符串消息) 验证两个指定的对象是否相等;记录有关验证成功或失败的自定义消息。
应为等于<T> (T,T 实际) 验证两个指定的对象是否相等。
AreEqual<T> (T expected,T actual,string message) 验证两个指定的对象是否相等;记录有关验证成功或失败的自定义消息。
应为 AreNotEqual (对象,对象实际) 验证两个指定的对象是否不相等。
应为 AreNotEqual (对象,对象实际,字符串消息) 验证两个指定的对象是否不相等;记录有关验证成功或失败的自定义消息。
AreNotEqual<T> (T expected, T actual) 验证两个指定的对象是否不相等。
AreNotEqual<T> (T expected,T actual,string message) 验证两个指定的对象是否不相等;记录有关验证成功或失败的自定义消息。
应为 AreSame (对象,实际) 验证指定的两个参数是否引用同一对象。
AreSame (应为对象,对象实际,字符串消息) 验证指定的两个参数是否引用同一对象;记录有关验证成功或失败的自定义消息。
应为 AreNotSame (对象,对象实际) 验证指定的两个参数是否不引用同一对象。
应为 AreNotSame (对象,对象实际,字符串消息) 验证指定的两个参数是否不引用同一对象;记录有关验证成功或失败的自定义消息。
IsGreaterThan (IComparable expectedGreater, IComparable expectedLess) 验证第一个参数是否大于第二个参数。
IsGreaterThan (IComparable expectedGreater、IComparable expectedLess、字符串消息) 验证第一个参数是否大于第二个参数;记录有关验证成功或失败的自定义消息。
IsGreaterThanOrEqual (IComparable expectedGreater, IComparable expectedLess) 验证第一个参数是否大于或等于第二个参数。
IsGreaterThanOrEqual (IComparable expectedGreater、IComparable expectedLess、字符串消息) 验证第一个参数是否大于或等于第二个参数;记录有关验证成功或失败的自定义消息。
IsLessThan (IComparable expectedLess, IComparable expectedGreater) 验证第一个参数是否小于第二个参数。
IsLessThan (IComparable expectedLess、IComparable expectedGreater、字符串消息) 验证第一个参数是否小于第二个参数;记录有关验证成功或失败的自定义消息。
IsLessThanOrEqual (IComparable expectedLess,IComparable expectedGreater) 验证第一个参数是否小于或等于第二个参数。
IsLessThanOrEqual (IComparable expectedLess、IComparable expectedGreater、字符串消息) 验证第一个参数是否小于或等于第二个参数;记录有关验证成功或失败的自定义消息。
(字符串消息) 失败 未检查任何条件而失败。
IsTrue (布尔条件) 验证指定的条件是否为 true。
IsTrue (bool 条件,字符串消息) 验证指定的条件是否为 true;记录有关验证成功或失败的自定义消息。
IsFalse (布尔条件) 验证指定的条件是否为 false。
IsFalse (bool 条件,字符串消息) 验证指定的条件是否为 false;记录有关验证成功或失败的自定义消息。
IsNull (object obj) 验证指定的参数是否为 NULL。
IsNull (对象 obj,字符串消息) 验证指定的参数是否为 NULL;记录有关验证成功或失败的自定义消息。
IsNotNull (object obj) 验证指定的参数是否不为 NULL。
IsNotNull (对象 obj,字符串消息) 验证指定的参数是否不为 NULL;记录有关验证成功或失败的自定义消息。
引发<T> (VerifyOperation 操作) 验证指定的操作是否引发给定的异常类型。 还返回异常以供进一步检查。
<引发 T> (VerifyOperation 操作、字符串消息) 验证指定的操作是否引发给定的异常类型;记录有关验证成功或失败的自定义消息。 还返回异常以供进一步检查。
NoThrow (VerifyOperation 操作) 验证指定的操作不会引发异常。
NoThrow (VerifyOperation 操作,字符串消息) 验证指定的操作是否不引发异常;记录有关验证成功或失败的自定义消息。

基于异常的验证使用情况

在 C# 测试用例中发生验证失败时,会向记录器和 WEX 写入错误。将引发 TestExecution.VerifyFailureException 。 与在本机 C++ 模型中一样,无需担心会捕获这些异常。 TAEF 框架将为你捕获它,并转到下一个测试用例。

(可选)如果要在一行中执行一系列验证,而不是在第一次验证失败时中止测试,可以使用 DisableVerifyExceptions 类。 对象的生存期控制禁用异常的时间量。 DisableVerifyExceptions 类是引用计数的,并且按线程运行。

using (new DisableVerifyExceptions())
{
    Verify.AreSame(item1, item2);
    Verify.AreEqual(item1, item2);
}

在上面的示例中,如果第一次验证调用失败,则仍进行第二次验证调用。

或者,可以通过在 Verify 操作之前设置 Verify.DisableVerifyExceptions = true 来实现相同的结果,如下面所示的示例。

Verify.DisableVerifyExceptions = true;
try
{
    Verify.AreSame(item1, item2);
    Verify.AreEqual(item1, item2);
}
finally
{
    Verify.DisableVerifyExceptions = false;
}

请注意,即使此类选项可用,仍建议将 DisableVerifyExeptions 声明为 using 块中的对象。

如果要在出现验证错误时停止调试器, (Ctrl+Alt+E) 打开异常对话框,请单击“添加”,在下拉列表中选择“公共语言运行时异常”,然后放入“WEX”。“名称”字段中的 TestExecution.VerifyFailureException”。

验证输出设置

如果要自定义验证 API 生成的输出,可以使用 SetVerifyOutput 类。 对象的生存期控制设置输出设置的时间量。 SetVerifyOutput 类是引用计数的,并且按线程运行。

using (new SetVerifyOutput(VerifyOutputSettings.LogOnlyFailures))
{
    Log.Comment("Only the following error should be logged:");
    Verify.IsTrue(true, "Should NOT log a comment");
    Verify.IsTrue(false, "Should log an error");
}
Verify.IsTrue(true, "Should log a comment");

在上面的示例中,只应记录第二次验证调用,因为它是 using 块中唯一失败的调用。 但是,即使第三次验证调用成功, 也会 记录该调用。 这是因为 SetVerifyOutput 类已超出了范围。

或者,可以通过在 Verify 操作(如下面所示的示例)之前设置 Verify.OutputSettings = VerifyOutputSettings.LogOnlyFailures 来实现相同的结果。

Verify.OutputSettings = VerifyOutputSettings.LogFailuresAsWarnings
try
{
    Verify.AreSame(item1, item2);
    Verify.AreEqual(item1, item2);
}
finally
{
    Verify.OutputSettings = VerifyOutputSettings.None;
}

请注意,即使此类选项可用,仍建议将 SetVerifyOutput 声明为 using 块中的对象。

存在以下用于设置验证输出的选项:

VerifyOutputSettings.LogOnlyFailures
仅记录失败的验证调用;忽略所有成功的调用。

VerifyOutputSettings.LogFailuresAsBlocked
将所有失败记录为已阻止,而不是记录错误。

VerifyOutputSettings.LogFailuresAsWarnings
将所有失败记录为警告,而不是记录错误。

验证输出设置是否可以将 OR 组合在一起以启用多个设置:

using (new SetVerifyOutput(VerifyOutputSettings.LogFailuresAsBlocked | VerifyOutputSettings.LogOnlyFailures))
{
...
}

使用验证脚本

验证 API 也针对脚本语言显示,遵循与 C++ 和 C# 相同的使用模式。

安装

在 TAEF 测试方法中使用可编写脚本的验证 API 时,无需安装 - 使用“免费注册 COM”注册所需的 API。 若要从 TAEF 测试方法外部使用可编写脚本的 API, (TAEF 外部,或在子进程) 只需从提升的命令提示符使用 regsvr32 注册Te.Common.dll二进制文件;例如:

regsvr32 Te.Common.dll

使用部署文件进行实验室执行部署 TAEF 时,会自动注册Te.Common.dll。

用法

可编写脚本的验证 API 通过“TE”显示。Common.Verify 的 COM 类 - 只需实例化该类并调用其上的方法 - Verify 类将自动与 WEXLogger 配合使用,以将通过和失败验证写入日志。

1   <?xml version="1.0" ?>
2   <?component error="false" debug="false"?>
3   <package>
4     <component id="Example">
5       <object id="Log" progid="Wex.Logger.Log" />
6       <object id="Verify" progid="Te.Common.Verify" />
7       <reference guid="e65ef678-a232-42a7-8a36-63108d719f31" version="1.0"/>
8       <reference guid="f8bb9db9-e54e-4555-b3e5-e3ddf2fef401" version="1.0"/>
9
10      <public>
11        <method name="HelloWorld"/>
12      </public>
13
14      <script language="JScript">
15          function HelloWorld() {
16              Verify.IsTrue(true);
17              Verify.IsFalse(false);
18          }
19      </script>
20    </component>
21  </package>

此示例使用单个“HelloWorld”方法定义 TAEF 脚本测试类。 第 6 行使用“object”元素在全局范围内定义 Verify 变量。 在本例中,第 8 行使用“reference”元素包括指定类型库 (的所有常量,Te.Common.dll的类型库) 脚本的全局范围;在本例中,它将添加“VerifySettings”常量。 第 16 行和第 17 行仅显示验证 API 的用法。 执行时,该示例将生成以下输出:

Test Authoring and Execution Framework v2.7 Build 6.2.7922.0 (fbl_esc_end_dev(mschofie).110202-1000) For x86

StartGroup: Example::HelloWorld
Verify: IsTrue
Verify: IsFalse
EndGroup: Example::HelloWorld [Passed]

Summary: Total=1, Passed=1, Failed=0, Blocked=0, Not Run=0, Skipped=0

可编写脚本的验证 API

针对可编写脚本的验证 API 的验证方法如下:

方法 功能
bool Verify.AreEqual (预期、实际、[可选消息]) 验证这两个值是否相等。 如果启用了“VerifySettings_CoerceTypes”设置,则此方法使用相等的 JScript 定义,如果未启用“VerifySettings_CoerceTypes”设置,则该方法使用标识的 JScript 定义。 默认情况下,“VerifySettings_CoerceTypes”处于打开状态。
bool Verify.AreNotEqual (预期、实际、[可选消息]) 验证这两个值是否不相等。 如果启用了“VerifySettings_CoerceTypes”设置,则此方法使用相等的 JScript 定义,如果未启用“VerifySettings_CoerceTypes”设置,则该方法使用标识的 JScript 定义。 默认情况下,“VerifySettings_CoerceTypes”处于打开状态。
bool Verify.IsGreaterThan (expectedGreater, expectedLess, [可选消息]) 验证第一个值是否大于第二个值。
bool Verify.IsGreaterThanOrEqual (expectedGreater, expectedLess, [可选消息]) 验证第一个值是否大于或等于第二个值。
bool Verify.IsLessThan (expectedLess, expectedGreater, [可选消息]) 验证第一个值是否小于第二个值。
bool Verify.IsLessThanOrEqual (expectedLess, expectedGreater, [可选消息]) 验证第一个值是否小于或等于第二个值。
bool Verify.AreSame (预期、实际、[可选消息]) 验证值是否相同。
bool Verify.AreNotSame (预期、实际、[可选消息]) 验证值是否不同。
bool Verify.Fail ([可选消息]) 未检查条件而失败。
bool Verify.IsTrue (表达式,[可选消息]) 验证给定表达式的计算结果是否为 true。
bool Verify.IsFalse (表达式,[可选消息]) 验证给定表达式的计算结果是否为 false。
bool Verify.IsNull (预期,[可选消息]) 验证给定值是否为“null”。
bool Verify.IsNotNull (预期,[可选消息]) 验证给定值是否不是“null”。
bool Verify.Throws (函数,[可选消息]) 验证给定函数是否引发异常。
bool Verify.NoThrow (函数,[可选消息]) 验证给定函数是否不引发 和 异常。

Verify 类中有两种方法用于控制设置:

方法 功能
object Verify.EnableSettings (设置) 将启用指定的设置标志。
object Verify.DisableSettings (设置) 指定的设置标志将被禁用。

传递给 Verify.EnableSettings 或 Verify.DisableSettings 方法的设置值可以是以下任何值:

VerifySettings_LogOnlyFailures = 0x01
仅记录失败 - 成功验证调用时没有输出。

VerifySettings_LogFailuresAsBlocked = 0x02
失败记录为“已阻止”,而不是默认的“错误”。

VerifySettings_LogFailuresAsWarnings = 0x04
失败记录为“警告”,而不是默认的“错误”。

VerifySettings_LogValuesOnSuccess = 0x08
要验证的参数值作为验证日志消息的一部分写入。 默认情况下,此选项处于打开状态。

VerifySettings_CoerceTypes = 0x1000
传递给 Verify 方法的值将按照 JScript 强制规则进行强制处理。 默认情况下,此选项处于打开状态。

VerifySettings_DisableExceptions = 0x2000
验证失败时不会引发异常。

验证设置

验证 API 提供用于配置其行为的设置。 “EnableSettings”和“DisableSettings”方法可用于启用或禁用 Verify 类维护的特定设置。 方法采用一个或多个设置来启用或禁用。

    Verify.EnableSettings(VerifySettings_LogOnlyFailures);

若要在一次调用中启用或禁用多个设置,可以包含多个“VerifySettings”标志:

    Verify.EnableSettings(VerifySettings_LogOnlyFailures | VerifySettings_DisableExceptions);

EnableSettings 和 DisableSettings 方法返回可用于还原原始设置的对象,允许在给定范围内启用或禁用设置;

1    var guard = Verify.EnableSettings(VerifySettings_LogOnlyFailures);
2    try
3    {
4        Verify.AreEqual(10, 0xa);
5    }
6    finally
7    {
8        guard.Restore();
9    }

在此示例中,将传递 Verify.EnableSettings 方法“VerifySettings_LogOnlyFailures”,该方法将与 Verify 对象上已存在的设置合并。 验证调用是在 try-finally 块中进行的,因此,在 finally 块期间,可以使用“guard”对象还原原始设置。

基于异常的验证使用情况

默认情况下,验证方法会在验证失败时引发异常。 在 TAEF 下运行时,如果异常从测试方法中引发,则测试将失败。 例如:

1    var guard = Verify.EnableSettings(VerifySettings_CoerceTypes);
2    try
3    {
4        Verify.AreEqual(1, "1");
5        Verify.AreEqual("1", 1);
6    }
7    finally
8    {
9        guard.Restore();
10   }

在此示例中,将永远不会进行第二个 Verify 调用,因为第一个调用将引发异常并失败测试。 验证 API 上的设置支持可用于更改此行为,以便不会引发失败的验证,从而允许进行后续的 Verify 调用。 这对于验证一组参数并确保写出所有验证特别有用。

1    var guard = Verify.EnableSettings(VerifySettings_CoerceTypes | VerifySettings_DisableExceptions);
2    try
3    {
4        Verify.AreEqual(1, "1");
5        Verify.AreEqual("1", 1);
6    }
7    finally
8    {
9        guard.Restore();
10   }

由于已禁用异常,因此这两个验证都将写入日志。

在 TAEF 外部使用可脚本验证 API

可在 TAEF 外部使用可编写脚本的验证 API。 确保注册Te.Common.dll,如 安装部分所述,并简单创建“TE”。Common.Verify“ 类。

var VerifySettings_DisableExceptions = 0x2000;

var Verify = new ActiveXObject("TE.Common.Verify");
var Log = new ActiveXObject("WEX.Logger.Log");

Verify.EnableSettings(VerifySettings_DisableExceptions);

Log.StartGroup("Group A");
Verify.AreEqual(1, 2);
Log.EndGroup("Group A");

Log.StartGroup("Group B");
Verify.AreEqual(2, 2);
Log.EndGroup("Group B");

通过 cscript 执行时,上述代码将生成以下控制台输出:

StartGroup: Group A
Error: Verify: AreEqual - Values (1, 2)
EndGroup: Group A [Failed]

StartGroup: Group B
Verify: AreEqual - Values (2, 2)
EndGroup: Group B [Passed]

Non-passing Tests:

    Group A [Failed]

Summary: Total=2, Passed=1, Failed=1, Blocked=0, Not Run=0, Skipped=0

'WEX。Logger.Log 的 API 可用于根据需要配置 WEX 记录器, (例如,作为子进程) ,可编写脚本的验证 API 将利用该配置。