在数据库单元测试中使用测试条件

在典型的数据库单元测试中,Transact-SQL 测试脚本将会运行并返回 ExecutionResult 类的一个实例。 此类的实例包含数据集、执行时间以及受脚本影响的行。 所有这些信息都在脚本执行过程中收集。这些结果可在 Transact-SQL 脚本中通过使用 RAISERROR 函数来计算,也可以通过使用测试条件来计算。 Visual Studio 高级专业版 提供了一组预定义的测试条件来供您使用。

预定义的测试条件

下表列出了可以使用“数据库单元测试”设计器中的“测试条件”窗格来添加的预定义测试条件。

测试条件

测试条件说明

数据校验和

如果从 Transact-SQL 脚本返回的结果集的校验和与预期的校验和不匹配,则不成立。 有关更多信息,请参见指定数据校验和。

注意注意
如果要返回的数据将会因不同的测试运行而变化,则不建议使用此测试条件。例如,如果结果集包含生成的日期或时间,或者包含标识列,则您的测试将会因每次运行的校验和不相同而失败。

空结果集

如果从 Transact-SQL 脚本返回的结果集不为空,则不成立。

执行时间

如果 Transact-SQL 测试脚本的执行时间长于预期时间,则不成立。 默认的执行时间为 30 秒。

执行时间只适用于测试脚本测试,而不适用于预先测试脚本或后期测试脚本。

预期的架构

如果结果集的列和数据类型与为测试条件指定的列和数据类型不匹配,则不成立。 必须通过测试条件的属性指定一个架构。 有关更多信息,请参见指定预期的架构。

没有结论

总是产生结果为“没有结论”的测试。 这是添加到每个测试的默认条件。 包括该测试条件是为了指示尚未实施测试验证。 添加了其他测试条件后,从测试中删除此测试条件。

非空结果集

如果结果集为空,则不成立。 可将此测试条件或 EmptyResultSet 与测试脚本中的 Transact-SQL @@RAISERROR 函数一起使用,以测试某个更新是否工作正常。 例如,可以保存更新前的值,运行更新,比较更新后的值,如果未获得预期结果,则会引发错误。

行数

如果结果集不包含预期的行数,则不成立。

标量值

如果结果集中的特定值不等于指定值,则不成立。 默认的“所需的值”为 null。

提示

“执行时间”测试条件指定 Transact-SQL 测试脚本运行时必须遵循的时间限制。 如果超过此时间限制,测试将会失败。 测试结果还包括持续时间统计信息,它不同于“执行时间”测试条件。 持续时间统计信息不仅包括执行时间,还包括两次连接数据库所需的时间;运行任何其他测试脚本(如预先测试脚本和后期测试脚本)的时间以及运行测试条件的时间。 因此,即使持续时间比执行时间长,测试仍可通过。

报告的持续时间不包括用于数据生成和架构部署的时间,因为它们发生在运行测试之前。 若要查看测试持续时间,请在“测试结果”窗口中选择一个测试运行,右击,然后选择“查看测试结果详细信息”

可以通过使用数据库单元测试设计器的“测试条件”窗格向数据库单元测试添加测试条件。 有关更多信息,请参见如何:向数据库单元测试中添加条件

还可以直接编辑测试方法代码,以便添加更多功能。 有关更多信息,请参见如何:打开数据库单元测试以进行编辑如何:编写在单个事务范围内运行的数据库单元测试。 例如,可通过添加 Assert 语句向测试方法添加功能。 有关更多信息,请参见在数据库单元测试中使用 Transact-SQL 断言

预期的失败

您可能会创建数据库单元测试来测试应该不会成功的行为。 这些预期的失败有时称为否定性测试。 一些示例包括:

  • 确认在指定无效的客户 ID 时,删除客户数据的存储过程将失败

  • 确认在从未下订单或已填充订单时,填充订单的存储过程将失败

  • 确认取消订单的存储过程无法取消已完成的订单或已取消的订单

可以为引发预期的 SQL 异常的存储过程定义数据库单元测试。 可以向单元测试方法中添加特性以指示应为哪个或哪些异常。 这样做之后,可以防止测试在发生异常时失败。

若要用预期的异常标记数据库单元测试方法,请添加以下特性:

[ExpectedSqlException(MessageNumber = nnnnn, Severity = x, MatchFirstError = false, State = y)]

其中:

  • nnnnn 是预期消息的编号,如 14025

  • x 是预期异常的严重级别

  • y 是预期异常的状态

忽略任何未指定的参数。 将这些参数传递给数据库代码中的 RAISERROR 语句。 如果将 MatchFirstError 指定为 false,则该特性将与异常中的任何 SqlError 匹配。 默认行为 (MatchFirstError = true) 是仅与发生的第一个错误匹配。

有关如何使用预期异常和否定性数据库单元测试的示例,请参见演练:创建和运行数据库单元测试

指定数据校验和

在将“数据校验和”测试条件添加到数据库单元测试之后,必须通过使用以下过程来配置预期的校验和:

指定预期校验和

  1. 在测试条件的列表中,单击要为其指定校验和的“数据校验和”测试条件。

  2. 按 F4 打开**“属性”窗口。 也可以先打开“视图”菜单,再单击“属性”**窗口。

  3. (可选)您可能需要更改测试条件的**“(名称)”**属性,以使其更具描述性。

  4. 在**“配置”属性中单击浏览 (…**) 按钮。

    将显示**“TestConditionName 的配置”**对话框。

  5. 指定与要测试的数据库的连接。 有关更多信息,请参见如何:创建数据库连接

  6. 默认情况下,测试的 Transact-SQL 主体显示在编辑窗格中。 如果需要,可以修改代码以生成预期的结果。 例如,如果测试中包含预先测试的代码,则可能必须添加该代码。

    重要说明重要事项

    如果修改校验和条件之前已对其指定校验和,则在编辑窗格中所做的任何更改都不会保存。 必须重新做出这些更改,然后才能单击“检索”

  7. 单击**“检索”**。

    将针对指定的数据库连接执行 Transact-SQL,相应的结果将显示在对话框中。

  8. 如果结果与测试的预期结果相匹配,请单击**“确定”**。 否则,请修改 Transact-SQL 主体并重复执行步骤 6、7 和 8,直至结果如预期那样。

    测试条件的**“值”**列将显示预期校验和的值。

指定预期架构

在将“预期架构”测试条件添加到数据库单元测试之后,必须通过使用以下过程来配置预期的架构:

指定预期架构

  1. 在测试条件的列表中,单击要为其指定架构的“预期架构”测试条件。

  2. 按 F4 打开**“属性”窗口。 也可以先打开“视图”菜单,再单击“属性”**窗口。

  3. (可选)您可能需要更改测试条件的**“(名称)”**属性,以使其更具描述性。

  4. 在**“配置”属性中单击浏览 (…**) 按钮。

    将显示**“TestConditionName 的配置”**对话框。

  5. 指定与要测试的数据库的连接。 有关更多信息,请参见如何:创建数据库连接

  6. 默认情况下,测试的 Transact-SQL 主体显示在编辑窗格中。 如果需要,可以修改代码以生成预期的结果。 例如,如果测试中包含预先测试的代码,则可能必须添加该代码。

    重要说明重要事项

    如果修改架构条件之前已对其指定架构,则在编辑窗格中所做的任何更改都不会保存。 必须重新做出这些更改,然后才能单击“检索”

  7. 单击**“检索”**。

    将针对指定的数据库连接执行 Transact-SQL,相应的结果将显示在对话框中。 由于您验证的是结果集的架构或形状而不是结果的值,因此只要相应列按预期方式显示,您就不必查看返回的结果中的任何数据。

  8. 如果结果与测试的预期结果相匹配,请单击**“确定”**。 否则,请修改 Transact-SQL 主体并重复执行步骤 6、7 和 8,直至结果如预期那样。

    测试条件的**“值”**列将显示有关预期架构的信息。 例如,它可能显示“应为: 2 个表”。

可扩展的测试条件

除了六个预定义的测试条件外,还可以编写自己的新测试条件。 这些测试条件将显示在数据库单元测试设计器的“测试条件”窗格中。 有关更多信息,请参见如何:为数据库单元测试设计器创建测试条件

请参见

概念

在数据库单元测试中使用 Transact-SQL 断言

数据库单元测试中的脚本