数据库单元测试概述

更新:2007 年 11 月

您可以使用数据库单元测试为数据库建立一个基线状态,然后验证您对数据库对象进行的任何后续更改。第一步是编写几组 T-SQL 测试,以试验某个数据库对象并确认该数据库对象工作正常。然后,当更改基础架构时,可以使用这些测试来确认这些更改没有破坏现有功能。通过编写单元测试来评估对数据库设计的更改是成功还是失败,可确保按预期的方式应用这些更改而不会引入错误。数据库单元测试是对软件开发人员创建的软件单元测试的补充。两组单元测试对于管理应用程序整体的更改都是必需的。

要编写单元测试,首先需要创建一个与成品数据库分开的独立的数据库开发环境。如果使用的是 Visual Studio Team System Database Edition,应遵循以下基本步骤:

  1. 创建一个数据库项目

  2. 将成品数据库的架构导入该项目

  3. 部署数据库项目以创建一个与成品数据库使用相同架构的数据库

  4. 用测试数据填充数据库

在建立了独立的数据库开发环境并填充数据之后,您就可以开始编写单元测试以在该环境中评估数据库对象。在测试完数据库对象后,这些单元测试可以用于检测由于数据库更改而导致的功能退化。通过在独立的开发环境中测试这些更改,可以确保成品数据库不会受到影响。在完全测试更改之后,可以将单元测试重新部署到包含其他团队成员所做更改的更大的测试环境中,从而通过这些测试可以快速识别并更正由于其他数据库更改而导致的功能退化。

作为手动部署过程的一部分,您还可以运行单元测试。在本例中,将从带有标签的一组源产生一个生成脚本,并根据需要编辑该生成脚本。将数据库部署到测试服务器,然后运行数据库和软件单元测试来验证数据库和整个应用程序的状态。在所有测试都通过后,您就可以将数据库重新部署到生产环境。有关更多信息,请参见管理数据库更改

创建数据库单元测试

您可以创建数据库单元测试来评估对任意数据库对象进行的更改。但是,Database Edition 还包括一些对数据库函数、触发器和存储过程的额外支持。为这些对象创建测试时,将自动生成用于测试数据库对象的 T-SQL 代码存根 (stub) 以供您自定义。有关更多信息,请参见如何:为函数、触发器和存储过程创建数据库单元测试如何:创建空的数据库单元测试

说明:

您可以在不打开数据库项目的情况下创建和运行数据库单元测试。然而,您必须打开包含您要测试的对象的数据库项目,才能基于这些对象生成 T-SQL 脚本。

设计单元测试

与 Visual Studio Team System Test Edition 中内置的其他测试类型一样,数据库单元测试也已经集成到 Visual Studio 中。通过使用“数据库单元测试设计器”,您可以先定义 Transact-SQL (T-SQL) 测试脚本以执行数据库脚本,然后对照测试条件评估这些脚本的结果以判断脚本操作成功还是失败。

“数据库单元测试设计器”包含以下功能:

功能

用途

导航栏 -“测试名称”列表框

在测试项目中按名称选择单个单元测试,或选择“公用脚本”开发在同一测试类中的每个单元测试之前或之后运行的脚本。

导航栏 -“测试”列表框

选择“预先测试”、“测试”或“后期测试”选项,以编写在单元测试期间的不同时间评估的 T-SQL 脚本和测试条件。您可以使用预先测试脚本在开发数据库内建立某种状态。您可以使用后期测试脚本使数据库在测试运行之后恢复到起始状态,或者根据所需权限,使用后期测试脚本来评估测试是否成功。

T-SQL 编辑器

使用此编辑器编写用在单元测试中的预先测试、测试和后期测试 T-SQL 脚本。使用 T-SQL RAISERROR 命令,您还可以在测试脚本中编写 T-SQL 断言语句,而不使用测试条件。与测试条件一样,此命令还可以用来基于严重级别的值来指示测试是通过还是失败。有关更多信息,请参见在数据库单元测试中使用 T-SQL 断言

“测试条件”窗格

使用此窗口中的测试条件可以评估 T-SQL 脚本执行的结果。

使用测试条件

“测试条件”窗格提供了一组预定义的测试条件,可测试结果集中返回的行数、执行 T-SQL 脚本所需的时间以及结果集是否为空等。每个预定义测试条件都有一个在评估测试条件时调用的 Assert 方法(在基类 TestCondition 上定义)。如果在对照所需的结果评估执行结果时测试条件失败,则该条件会引发异常并在“测试结果”窗口返回失败结果。测试条件通过不引发异常来指示测试通过。

运行测试时,首先运行 T-SQL 脚本然后返回结果。通常情况下,返回的是一个结果集。测试条件的实现决定了评估返回信息的哪个部分来判断测试是否成功。例如,“执行时间”测试条件评估执行 T-SQL 脚本所需的时间,“标量值”测试条件评估特定行中的值。根据此评估的结果,将在“测试结果”窗口中显示通过或失败指示。通过/失败指示依据的是对测试脚本的所有测试条件的评估是否成功。如果有一个条件引发了异常,则整个测试失败。

虽然存在六个预定义的测试条件,但由于测试条件是可扩展的,因此可根据需要将其他条件添加到测试条件列表中。还可以使用 T-SQL 脚本内的 T-SQL RAISERROR 函数来产生“通过”或“失败”结果并将其显示在“测试结果”窗口中。有关更多信息,请参见 在数据库单元测试中使用 T-SQL 断言

说明:

“没有结论”的测试条件会自动添加到在 Test Edition 中生成的单元测试中以及在 Database Edition 中生成的数据库单元测试中。如果评估此测试条件,则测试将被标记为“没有结论”。没有结论的测试条件会引发 InconclusiveException。默认情况下,该测试条件包括在所有的测试中,以提醒您添加其他断言或测试条件。通过在“测试条件”窗口中选择该测试条件并单击“删除测试条件”图标,可以轻松将其移除。

有关预定义测试条件的完整列表,请参见在数据库单元测试中使用测试条件

如果测试超时或中止,测试也可能失败。有关在“测试结果”窗口可能看到的结果的更多信息,请参见基本测试结果

单元测试和测试数据

您可以使用 Team Edition for Database Professionals 的数据生成功能向数据库环境中添加测试数据。此功能包括一组数据生成器,如果给定特定的种子值,将生成相同的数据。这样您便可以生成数据,检查生成的数据库以确定各个测试应生成的结果,然后编写相应的测试。有关如何将数据生成用于单元测试的更多信息,请参见演练:创建和运行数据库单元测试。有关各种数据生成器的更多信息,请参见生成数据概述

在命令行上测试

如果希望自动运行测试,可以在 IDE 内或在命令提示符下运行数据库单元测试。有关更多信息,请参见执行命令行测试

请参见

任务

如何:向数据库单元测试中添加条件

概念

Transact-SQL 编辑器概述

Database Edition 术语概述