在 SQL Server 单元测试中使用测试条件

在 SQL Server 单元测试中,执行一个或多个 Transact-SQL 测试脚本。 可以在 Transact-SQL 脚本中评估结果, THROW 或者 RAISERROR 用于返回错误并失败测试,也可以在测试中定义测试条件以评估结果。 测试返回 SqlExecutionResult 类的实例。 此类的实例包含一个或多个数据集、执行时间和受脚本影响的行。 在执行脚本期间收集所有这些信息。 可以使用测试条件评估这些结果。 SQL Server Data Tools 提供了一组预定义的测试条件。 还可以创建和使用自定义条件;请参阅 SQL Server 单元测试的自定义测试条件

预定义的测试条件

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

测试条件 测试条件说明
数据校验和 如果从 Transact-SQL 脚本返回的结果集的校验和与预期的校验和不匹配,则失败。 有关详细信息,请参阅 指定数据校验和

注意: 如果返回在测试运行之间变化的数据,则不建议使用此测试条件。 例如,如果结果集包含生成的日期或时间,或包含标识列,则测试会失败,因为每次运行时校验和不同。
空结果集 如果从 Transact-SQL 脚本返回的结果集不为空,则失败。
执行时间 如果 Transact-SQL 测试脚本的执行时间超过预期,则失败。 默认执行时间为 30 秒。

执行时间仅适用于测试脚本测试,不适用于预测试脚本或测试后脚本。
预期架构 如果结果集的列和数据类型与为测试条件指定的列和数据类型不匹配,则失败。 必须通过测试条件的属性指定架构。 有关详细信息,请参阅 指定预期的架构
无结论 始终生成结果为“Inconclusive”的测试。 这是添加到每个测试的默认条件。 包括此测试条件以指示尚未实施测试验证。 添加其他测试条件后,请从测试中删除此测试条件。
非空的ResultSet 如果结果集为空,则失败。 可以在测试脚本中将此测试条件或 EmptyResultSet 与 Transact-SQL @@RAISERROR 函数一起使用,以测试更新是否正常工作。 例如,可以保存更新前值、运行更新、比较更新后值,如果未获得预期结果,则引发错误。
行计数 如果结果集不包含预期的行数,则失败。
标量值 如果结果集中的特定值不等于指定值,则失败。 默认 期望值 为 Null。

执行时间测试条件指定 Transact-SQL 测试脚本必须运行的时间限制。 如果超出此时间限制,测试将失败。 测试结果还包括持续时间统计信息,与执行时间测试条件不同。 持续时间统计信息不仅包括执行时间,还包括两次连接到数据库的时间:运行任何其他测试脚本的时间,例如预测试脚本和测试后脚本;以及运行测试条件的时间。 因此,即使测试的持续时间超过其执行时间,测试也可以通过。

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

可以使用 SQL Server 单元测试设计器的“测试条件”窗格将测试条件添加到 SQL Server 单元测试。 有关详细信息,请参阅 “如何:向 SQL Server 单元测试添加测试条件”。

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

预期失败

可以创建 SQL Server 单元测试来测试不应成功的行为。 这些预期的失败有时称为负面测试。 一些示例包括:

  • 如果指定了无效的客户 ID,请验证删除客户的数据的存储过程是否失败。
  • 验证执行填充订单的存储过程是否在订单从未下达或者订单已填充的情况下失败。
  • 验证用于取消订单的存储过程无法取消已完成的订单或已取消的订单。

可以为引发预期异常的存储过程定义 SQL Server 单元测试。 可以为单元测试方法添加属性,以指明预期的异常。 通过执行此作,可以阻止测试在发生异常时失败。

若要标记具有预期异常的 SQL Server 单元测试方法,请添加以下属性:

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

Where:

  • nnnnn 是预期的消息数,例如 14025
  • x 是预期异常的严重性
  • y 是预期异常的状态

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

有关如何使用预期异常和负 SQL Server 单元测试的示例,请参阅 演练:创建和运行 SQL Server 单元测试

指定数据校验和

若要显示 SQL Server 单元测试设计器,请在 解决方案资源管理器中双击单元测试源代码文件。

向数据库单元测试添加数据校验和测试条件后,必须使用以下过程配置预期的校验和:

指定预期的校验和

  1. 在测试条件列表中,选择需要指定校验和的数据校验和测试条件。

  2. F4 打开“属性”窗口。 还可以打开 “视图 ”菜单,然后选择“ 属性 窗口”。

  3. (可选)你可能想要将测试条件的 (Name) 属性更改为更具描述性。

  4. “配置” 属性中,选择“浏览”按钮

    此时会显示 “TestConditionName 配置 ”对话框。

  5. 指定要测试的数据库的连接。 有关详细信息,请参阅 “如何:创建数据库连接”。

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

    重要

    如果修改以前指定校验和的校验和条件,则不会保存你在编辑窗格中所做的任何更改。 在选择“ 检索”之前,必须再次进行这些更改。

  7. 选择“检索”

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

  8. 如果结果与测试的预期结果匹配,请选择“ 确定”。 否则,请修改 Transact-SQL 正文,并重复步骤 6、7 和 8,直到结果按预期进行。

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

指定预期的架构

将预期架构测试条件添加到 SQL Server 单元测试后,必须使用以下过程配置预期的架构:

指定预期的架构

  1. 在测试条件列表中,选择要为其指定架构的预期架构测试条件。

  2. F4 打开“属性”窗口。 还可以打开 “视图 ”菜单,然后选择“ 属性” 窗口。

  3. (可选)你可能想要将测试条件的 (Name) 属性更改为更具描述性。

  4. “配置” 属性中,选择“浏览”按钮

    此时会显示 “TestConditionName 配置 ”对话框。

  5. 指定要测试的数据库的连接。 有关详细信息,请参阅 “如何:创建数据库连接”。

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

    重要

    如果您修改先前已指定架构的预期架构条件,那么您在编辑窗格中所做的任何更改都不会被保存。 在选择“ 检索”之前,必须再次进行这些更改。

  7. 选择“检索”

    Transact-SQL 针对指定的数据库连接执行,结果将显示在对话框中。 由于你正在验证结果集的架构或形状,而不是结果的值,所以只要列以预期它们出现的方式显示,就不必在返回的结果中看到任何数据。

  8. 如果结果与测试的预期结果匹配,请选择“ 确定”。 否则,请修改 Transact-SQL 正文,并重复步骤 6、7 和 8,直到结果按预期进行。

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

可扩展测试条件

除了六个预定义的测试条件之外,还可以编写自己的新测试条件。 这些测试条件显示在 SQL Server 单元测试设计器的“测试条件”窗格中。 有关详细信息,请参阅 SQL Server 单元测试的自定义测试条件