创建 SQL Server 数据库单元测试






4.68/5 (9投票s)
创建存储过程、触发器、函数的单元测试,并将其集成到 TFS 持续集成周期中
引言
自 Visual Studio 2005 (Team Edition for DB Pro) 起,就可以创建 SQL Server 数据库测试 (SSDT) 项目。但随着 Visual Studio 2010+ professional 或更高版本的推出,通过 Visual Studio 与 SQL Server 的集成,这已经变得更加主流。SSDT 引入了一个新的 SQL Server 单元测试模板和类型。
过去,您可能使用 PONT (plain old NUnit test) 来验证存储过程/函数/触发器的有效性,只需在相应的方法上使用 TestFixtureSetUp 和 TestFixtureTearDown 注释来向数据库添加数据,执行 NUnit 测试,然后清理数据库以供下一个 NUnit 测试使用。
这种方法多年来一直对开发人员很有效,因为他们已经习惯于在 C#/VB.NET 中开发 NUnit/MSTest 脚本——只需在单元测试中添加 ADO.NET 命令,他们就可以测试数据库架构了。现在,Visual Studio 将自动在后台生成样板代码,让您可以使用 UI 创建相应的断言测试。
数据库脚本
导航到 SQL Server Management Studio,打开一个新的查询分析器窗口,首先导入并执行 SQL 脚本 FabricsDatabaseObjects.sql,然后通过执行 SQL 脚本 FabricsDatabaseData.sql (如上附件)导入数据。
执行完这两个脚本后,您应该会得到一个如下所示的数据库架构,其中包含一个存储过程和一个新的 SQL Server 登录名 (DatabaseTester
)。
创建数据库项目
在设计任何数据库单元测试之前,我们必须先创建一个数据库项目来包含我们数据库架构的所有各种 SQL 对象。打开 Visual Studio 2013,创建一个名为 FabricsDatabase
的新数据库项目。
导入现有数据库架构
如果您已经设计了数据库架构,请右键单击数据库项目,然后在上下文菜单中选择导入数据库。输入数据库服务器凭据、服务器名称,然后选择 Fabrics 数据库。
导入数据库架构后,将显示一个摘要,说明遇到的任何问题/冲突。
Fabrics 数据库架构将导入到 Visual Studio 数据库项目中。
创建数据库单元测试
从 Visual Studio 中打开 SQL Server 对象资源管理器窗格。
导航到 Projects 文件夹,然后向下展开到我们要为其创建单元测试的存储过程 (在本例中为 Top10_OrderTotalLessThan50)。
右键单击相应的存储过程,然后选择上下文菜单 Create Unit Tests… 选项。
选择 C# 作为项目,输入新 Unit Tests 项目的名称,并为测试类命名,然后单击 OK。
为确保测试的完整性,您必须关联一个数据库供测试运行。从下拉列表中选择 Fabrics
数据库,然后单击 OK – 理想情况下,这应该是您的 CI 或 QA 数据库服务器。
将打开一个默认窗格,您可以在其中创建针对存储过程的断言测试。在底部,您将看到测试,默认情况下有一个 inconclusive 测试。通过单击红色 X 来删除此测试 (提示:您可能需要单击两次!)
删除最后一个 Select
语句,因为它会影响您的测试。
测试条件
Test Conditions 下拉列表中有 8 种断言。
我们将为该过程创建几个测试,一个测试用于确定
- 返回的行数
- 验证是否未返回空结果集
- 测试结果集 [行, 列] 值
- 对返回的结果集执行校验和 – 以验证结果集是否符合预期。
验证行数
从下拉列表中选择 Row Count,然后单击加号,右键单击断言并选择属性。
行计数测试的默认设置将验证是否未返回任何行。我们可以运行此测试,并看到它将失败。
打开 Test Explorer 来运行测试。
如果右键单击测试 dbo_Top10_OrderTotalLessThan50Test 并选择 Run Selected Tests。
测试将失败,因为我们声明期望返回 1 行,但实际上返回了 10 行。
要纠正测试,只需更改属性设置,将 Row Count 更改为 10
,保存更改并重新运行测试,这次它应该会通过。
添加一个 Checksum
测试条件。这次,我们将一次性测试返回的所有数据 (结果集),通过使用校验和值进行比较。为测试命名,然后在属性窗格中选择 Press to configure 椭圆。
这将显示 Checksum
条件的配置屏幕。选择要使用的适当连接,然后单击 Retrieve
按钮以在底部窗格中返回该 resultset
,然后保存。将为该 resultset
生成一个 checksum
– 测试将与此进行比较以验证断言。这是一种快速比较整个 resultset
的便捷方法。
测试生成的 checksum
让我们通过修改返回的数据来使 checksum
测试失败,在 Client
表中将名字 Elton
修改为 Elton_Bert
并重新运行测试。
您现在将收到一个失败的 checksum
测试,报告 checksum
值。因此,您可以自信地假设 checksum
是验证 resultset
的简单方法。修改 Client
表并将名字更改恢复,以纠正测试。
最后,我们将添加一个标量测试,用于测试 resultset
中的一行/列的值。
添加并重命名标量测试后,转到属性并选择要测试的字段的行号和列号。在本例中,是第 2 行和第 7 列 (这是 totals 字段) – 我们将测试该值是否为 1.9200000。
再次运行测试,以验证所有测试是否都通过。
测试前和测试后条件
与任何单元测试一样,有设置和拆卸部分。如果您希望在运行相应测试之前在数据库中包含特定数据,则可以创建一个测试前条件来实现此目的。
将出现测试前编辑器,您可以在其中输入在数据库中需要执行的任何测试前逻辑 – 这里不是执行 C# 逻辑的地方 – 只能是 SQL。测试后部分也是如此 – 您可以在下一个测试之前在此处拆卸/清理任何数据库逻辑。
例如,我创建了这个带有测试数据的数据库,用于黑盒测试,数据将在每次测试前插入/删除 (通常情况下,数据库将通过创建脚本预先填充静态数据)。
从测试项目中删除默认的 C# 类 UnitTest1.cs。
注意: 这是一个标准的 C# 单元测试项目。
将数据库单元测试集成到 TFS 持续集成中
我已经连接到我的在线 TFS 账户并检入了代码。
我可以排队构建……但是!
我每次检入代码时都会收到以下错误,因为连接字符串无效,无法从在线 TFS 存储库连接到我的 PC – 此外,网络防火墙不允许连接。但是,如果这是您自己的环境/网络 – 您的构建将成功排队,您的测试也将成功。
杂项
使用 Table-Adapter 生成 CRUD 存储过程
要根据表结构为数据库创建 CRUD 过程,开发人员一直使用 TableAdapter
来快速创建存储过程,然后快速修改它们以满足特定需求 – 这种方法可以节省您的时间。您需要将数据库导入到您的 Visual Studio 项目中,以获取最新的数据库更改。
SSMS 工具生成 CRUD 存储过程
下载最新的 SSMS Tools pack (http://ssmstoolspack.com/Download) SQL Server 2008+
如果您然后右键单击数据库表,将出现一个新的选项 SSMS Tools,允许您生成 CRUD 过程。