使用tsqlt框架对SPs进行单元测试
在这篇文章中,看看如何通过使用tsqlt框架添加单元测试来轻松测试存储程序。
编写单元测试来测试代码是编程中不可避免的做法。测试存储过程和其他代码一样重要。通常情况下, SP是手动测试的,我们避免添加一个自动测试。在敏捷的环境中,没有测试的代码在某些时候很容易出现缺陷。在这篇文章中,让我们看看tsqlt框架--一个用于SQL Server的开源数据库单元测试框架。
前提条件
- 代码编辑器(例如,IntelIj)。
- SQL数据库
将你的编辑器连接到运行中的数据库。数据库可以在本地、云端或任何虚拟机中运行。
创建测试对象
创建一个新的测试类,如下所示。 在数据库的附加会话中运行这个将在数据库中创建一个测试对象。我们将在这个对象中添加所有的测试脚本 (SPs)。
SQL
EXEC tsqlt.NewTestClass 'EMPLOYEE'
GO
注意新创建的对象中的测试。我们将在下面详细阅读这些测试。现在我们都准备好了,可以写我们的测试了。
表和SP的细节
下面是我们在本文中将要看到的例子的表的细节和SP。
表名: 表名:Employee,有列emp_no,emp_name和salary。
存储过程1: 从表中选择行。
SQL
CREATE PROCEDURE [dbo].[get_all_employees_v1]
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT emp_no
, emp_name
, salary
FROM dbo.employee c
END
GO
存储过程2: 插入一条新记录。
SQL
CREATE PROCEDURE [dbo].[update_employees_v1]
@emp_no INT
,@emp_name VARCHAR(20)
,@salary INT
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
INSERT INTO dbo.employee (emp_no, emp_name, salary)
VALUES (@emp_no, @emp_name, @salary)
END
GO
让我们看看如何为上述SP编写测试。
测试模式
我们为返回结果和更新记录的SP编写不同结构的测试。两者没有大的区别,只是在填充预期表和实际表时有一个简单的区别。
对于选择
-
创建假表。
-
在表中插入测试数据。
-
创建预期表和实际表。
-
运行SP并把结果放到 "实际 "表中。
-
比较 "预期 "和 "实际 "表。
SQL
CREATE OR ALTER PROCEDURE [EMPLOYEE].[test employee]
AS
BEGIN
-- ARRANGE (fake synonym table employee is created)
EXEC tSQLt.FakeSynonymTable 'employee', 'dbo';
-- Test data insertion
INSERT INTO dbo.employee (emp_no, emp_name, salary) VALUES (2, 'xxx', 1000);
-- Actual table is defined
SELECT emp_no, emp_name, salary INTO #actual FROM dbo.employee where 1 = 0
-- Create an empty #Expected temp table that has the same structure as the #Actual table
SELECT TOP (0) *
INTO #expected
FROM #actual;
-- Run the SP and store results in actual table
INSERT INTO #actual
EXEC dbo.get_all_employees_v1
-- Populate expected table with desired results
INSERT INTO #expected (emp_no, emp_name, salary) VALUES (2, 'xxx', 1000);
-- Assert expected and actual
EXEC tSQLt.AssertEqualsTable '#expected', '#actual', 'missing expected row'
END
GO
使用下面的代码运行测试,看到测试通过。
EXEC tSQLT.RUN 'EMPLOYEE.[test employee]'
插入或更新或删除
- 创建假表。
- 插入测试数据到表。
- 创建预期和实际的表。
- 运行SP。
- 将原始表中被修改的记录复制到实际表中。
- 比较 "预期 "和 "实际 "表。
SQL
CREATE OR ALTER PROCEDURE [EMPLOYEE].[test update_employee]
AS
BEGIN
-- ARRANGE (fake synonym table employee is created)
EXEC tSQLt.FakeSynonymTable 'employee', 'dbo';
-- Create expected tables
CREATE TABLE #expected (emp_no int, emp_name VARCHAR(20), salary int)
-- Run the SP
EXEC dbo.update_employees_v1 @emp_no=1, @emp_name='test', @salary=300
-- Above step had already create a new record in the table. Read it and store it in actual table
SELECT emp_no, emp_name, salary INTO #actual FROM dbo.employee WHERE emp_no=1
-- Populate expected table with desired results
INSERT INTO #expected (emp_no, emp_name, salary) VALUES (1, 'test', 300);
-- Assert expected and actual
EXEC tSQLt.AssertEqualsTable '#expected', '#actual', 'missing expected row'
END
GO
运行测试,使用
EXEC tSQLT.RUN 'EMPLOYEE.[test employee]'
结论
为任何一段代码编写测试对于防止错误是很重要的。SPs也不例外。为SP编写自动化测试是一个很好的选择,可以很早很有效地测试它们。