每个 SQL Server 单元测试都包含单个预测试作、测试作和测试后作。 这些操作又包含:
- 对数据库执行的 Transact-SQL 脚本。
- 评估脚本执行返回的结果的零个或多个测试条件。
测试作中的 Transact-SQL 测试脚本是每个 SQL Server 单元测试中必须包含的唯一组件。 除了测试脚本本身,你可能还想要指定测试条件来验证测试脚本是否返回了所需的值或值集。 测试操作执行或更改数据库中的对象,然后评估该更改。
对于每个测试动作,可以包括一个预测试动作和一个测试后动作。 与测试作类似,每个预测试作和每个测试后作都包含一个 Transact-SQL 脚本和零个或多个测试条件。 可以使用预测试作来确保数据库处于允许测试作运行并返回有意义的结果的状态。 例如,可以使用预测试操作来验证表中是否包含数据,然后在测试脚本对该数据执行操作之前进行验证。
在预测试作准备数据库并测试作返回有意义的结果后,可以使用测试后作将数据库返回到运行预测试作之前处于的状态。 或者,在某些情况下,可以使用后测试操作来验证测试操作的结果。 这是因为测试后作可以具有比测试作更大的数据库权限。 有关详细信息,请参阅 连接字符串和权限概述。
除了这三个作外,还有两个测试脚本(称为通用脚本),这些脚本在每个 SQL Server 单元测试运行之前和之后运行。 因此,在执行单个 SQL Server 单元测试期间最多可以运行五个 Transact-SQL 脚本。 只需要测试作中包含的 Transact-SQL 脚本;常见的脚本和预测试和测试后作脚本是可选的。
下表提供了与任何 SQL Server 单元测试关联的脚本的完整列表。
| Action | 脚本类型 | Description |
|---|---|---|
| TestInitialize | 常见脚本(初始化) | (可选)此脚本位于单元测试中的所有预测试和测试作之前。 TestInitialize 脚本在给定测试类中的每个单元测试之前运行。 此脚本使用特权上下文执行。 |
| 预测试 | 测试脚本 | (可选)此脚本是单元测试的一部分。 预测试脚本在单元测试中的测试作之前运行。 此脚本使用特权上下文执行。 |
| 测试 | 测试脚本 | (必需)此脚本是单元测试的一部分。 例如,此脚本可能运行获取、插入或更新表值的存储过程。 此脚本使用执行上下文执行。 |
| 测试结束后 | 测试脚本 | (可选)此脚本是单元测试的一部分。 测试后脚本在单个单元测试后运行。 此脚本使用特权上下文执行。 |
| TestCleanup | 常见脚本 (清理) | (可选)此脚本遵循单元测试。 TestCleanup 脚本在给定测试类中的所有单元测试之后运行。 此脚本使用特权上下文执行。 |
有关其中每个脚本执行的不同安全上下文的详细信息,请参阅 连接字符串和权限概述。 还可以查看《SQL Server 数据工具所需的权限》中的“SQL Server 单元测试的权限”部分。
运行脚本的顺序
请务必了解每个脚本运行的顺序。 虽然无法更改该顺序,但可以决定要运行的脚本。 下图包括可在包含两个 SQL Server 单元测试的测试运行中使用的脚本的选择,并显示它们运行的顺序:
注释
如果配置了 SQL Server 数据库项目部署,则此步骤在测试运行开始时,在特权上下文连接字符串下执行。 有关详细信息,请参阅 如何:配置 SQL Server 单元测试执行。
初始化和清理脚本
在 SQL Server 单元测试设计器中,TestInitialize 和 TestCleanup 脚本称为通用脚本。 前面的示例假定这两个单元测试是同一测试类的一部分。 因此,它们共享相同的 TestInitialize 和 TestCleanup 脚本。 对于单个测试类中的所有单元测试,始终如此。 但是,如果测试运行包含来自不同测试类的单元测试,则关联的测试类的常见脚本在单元测试运行之前和之后运行。
如果仅使用 SQL Server 单元测试设计器编写单元测试,则可能不熟悉测试类的概念。 每次打开 “测试 ”菜单并选择“ 新建测试”来创建单元测试时,SQL Server Data Tools 都会生成测试类。 测试类显示在 解决方案资源管理器 中,其中包含指定的测试名称,后跟一个 .cs 或 .vb 扩展。 在每个测试类中,各个单元测试都存储为测试方法。 但是,无论测试方法的数量(即单元测试),每个测试类都可以有零个或一个 TestInitialize 和 TestCleanup 脚本。
可以使用 TestInitialize 脚本准备测试数据库,并且可以使用 TestCleanup 脚本将测试数据库返回到已知状态。 例如,可以使用 TestInitialize 创建稍后在测试脚本中运行的帮助程序存储过程,以测试其他存储过程。
预测试和测试后脚本
与前置测试和后置测试关联的脚本可能会因单元测试而异。 可以使用这些脚本来建立数据库的增量更改,然后清理这些更改。