数据库单元测试中的脚本

每个数据库单元测试包含一个预先测试操作、一个测试操作和一个后期测试操作。 而其中每个操作都包含以下内容:

  • 一个针对数据库执行的 Transact-SQL 脚本

  • 零个或多个测试条件,用于评估脚本执行所返回的结果。

测试操作中的 Transact-SQL 测试脚本是必须包括在每个数据库单元测试中的唯一组件。 除了测试脚本自身外,可能还需要指定用于验证测试脚本是否返回了所需的值或值集的测试条件。测试操作执行或更改该数据库中的特定对象,然后评估该更改。

对于每个测试操作,可以包括一个预先测试操作和一个后期测试操作。 与测试操作相似,每个预先测试操作和后期测试操作都包含一个 Transact-SQL 脚本和零个或多个测试条件。 可以使用预先测试操作来确保数据库处于可允许测试操作运行并返回有意义结果的状态。例如,可以使用预先测试操作在测试脚本对表中的数据执行操作之前验证该表包含这些数据。 预先测试操作准备好数据库且测试操作返回有意义的结果之后,后期测试操作将数据库返回到预先测试操作运行之前的状态。在某些情况下,可以使用后期测试操作来验证测试操作的结果。 这是因为后期测试操作具有的数据库权限大于测试操作具有的数据库权限。 有关更多信息,请参见连接字符串和权限概述

除了这三种操作外,还有两个在运行数据库单元测试之前和之后运行的测试脚本(称为公用脚本)。 因此,在一次数据库单元测试执行期间,最多可以运行五个 Transact-SQL 脚本。 只有包含在测试操作中的 Transact-SQL 脚本是必需的;公用脚本和预先测试操作及后期测试操作脚本是可选的。

下表完整列出了与任何数据库单元测试关联的脚本。

操作

脚本类型

说明

TestInitialize

公用脚本(初始化)

(可选)此脚本优先于单元测试中的所有预先测试操作和测试操作。 TestInitialize 脚本在给定测试类中的每个单元测试之前运行。 此脚本使用特权上下文执行。

Pre-test

测试脚本

(可选)此脚本是单元测试的一部分。 预先测试脚本在单元测试中的测试操作之前运行。 此脚本使用特权上下文执行。

Test

测试脚本

(必需)此脚本是单元测试的一部分。 测试脚本针对数据库运行。 例如,此脚本可以运行存储过程以获取、插入或更新表值。 此脚本使用执行上下文执行。

Post-test

测试脚本

(可选)此脚本是单元测试的一部分。 后期测试脚本在每个单元测试之后运行。 此脚本使用特权上下文执行。

TestCleanup

公用脚本(清理)

(可选)此脚本在单元测试之后运行。 TestCleanup 脚本在给定测试类中的所有单元测试之后运行。 此脚本使用特权上下文执行。

有关上述每个脚本执行时所处的不同安全上下文的更多信息,请参见连接字符串和权限概述执行 Visual Studio 的数据库功能所需的权限 中的“数据库单元测试权限”部分。

脚本运行顺序

了解每个脚本的运行顺序很重要。 虽然您无法更改该顺序,但可以决定想要运行哪些脚本。 下图包括可以在包含两个数据库单元测试的测试中使用的选定脚本,并显示这些脚本的运行顺序:

两个数据库单元测试

提示

数据生成和数据库部署更改在开始运行测试时、执行任何脚本之前应用。 这些更改是使用特权上下文连接字符串应用的。 有关更多信息,请参见如何:配置数据库单元测试执行

初始化脚本和清理脚本

在数据库单元测试设计器中,TestInitialize 和 TestCleanup 脚本称为公用脚本。 前面的示例假定两个单元测试属于同一测试类。 因此,它们共享相同的 TestInitialize 和 TestCleanup 脚本。 对于一个测试类中的所有单元测试,始终是这种情况。 但是,如果您的测试运行包含属于其他测试类的单元测试,则相关测试类的公用脚本将在单元测试运行之前和之后运行。

如果您只使用数据库单元测试设计器来编写单元测试,则您可能不熟悉测试类的概念。 每次通过打开**“测试”菜单并单击“新建测试”来创建单元测试时,Visual Studio 高级专业版都会生成一个测试类。 测试类使用您指定的测试名显示在“解决方案资源管理器”**中,且测试名后面跟随 .cs 或 .vb 扩展名。 在每个测试类中,单个单元测试存储为测试方法。 但是,无论测试方法(即单元测试)的数量有多少,每个测试类只能具有零个或一个 TestInitialize 和 TestCleanup 脚本。

可以使用 TestInitialize 脚本来准备测试数据库,使用 TestCleanup 脚本将测试数据库恢复到某个已知状态。 例如,可以使用 TestInitialize 在测试脚本中创建一个以后运行的帮助器存储过程,以测试不同的存储过程。

预先测试脚本和后期测试脚本

对于不同单元测试,与预先测试操作和后期测试操作关联的脚本可能不同。 可以使用这些脚本来建立对数据库的增量更改,然后清理这些更改。

请参见

概念

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