编写单元测试来测试代码是编程中不可避免的做法。测试存储过程与其他代码一样重要。SP通常是手动测试的,我们避免添加自动化测试。在敏捷环境中,未经测试的代码在某些时候容易出现缺陷。在本文中,让我们了解一下tsqlt框架——一个用于SQL Server的开源数据库单元测试框架。
先决条件
- 代码编辑器(例如 IntelIj)
- SQL 数据库
将您的编辑器附加到正在运行的数据库。数据库可以在本地、云或任何虚拟机中运行。
创建测试对象
创建一个新的测试类,如下所示。在附加的 DB 会话中运行它会在 DB 中创建一个测试对象。我们将在此对象中添加所有测试脚本(SP)。
SQL1执行 tsqlt .NewTestClass 'EMPLOYEE'2去
注意新创建的对象内的测试。我们将在下面详细阅读测试。我们现在都准备好编写测试了。
表和 SP 详细信息
下面是我们将在本文中看到的示例的表格详细信息和 SP。
表名: 具有列 emp_no、emp_name 和薪水的员工。
存储过程 1: 从表中选择行。
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:插入一条新记录。
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 并将结果放入“实际”表中。
- 比较“预期”和“实际”表。
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。
- 将修改过的记录从原始表复制到实际。
- 比较“预期”和“实际”表。
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]'
结论
为任何一段代码编写测试对于防止错误很重要。SP也不例外。为 SP 编写自动化测试是非常早且高效地测试它们的好选择。