使用tsqlt框架对SP进行单元测试

205 阅读3分钟

使用tsqlt框架对SPs进行单元测试

在这篇文章中,看看如何通过使用tsqlt框架添加单元测试来轻松测试存储程序。

编写单元测试来测试代码是编程中不可避免的做法。测试存储过程和其他代码一样重要。通常情况下, SP是手动测试的,我们避免添加一个自动测试。在敏捷的环境中,没有测试的代码在某些时候很容易出现缺陷。在这篇文章中,让我们看看tsqlt框架--一个用于SQL Server的开源数据库单元测试框架。

前提条件

将你的编辑器连接到运行中的数据库。数据库可以在本地、云端或任何虚拟机中运行。

创建测试对象

创建一个新的测试类,如下所示。 在数据库的附加会话中运行这个将在数据库中创建一个测试对象。我们将在这个对象中添加所有的测试脚本 (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编写不同结构的测试。两者没有大的区别,只是在填充预期表和实际表时有一个简单的区别。

对于选择

  1. 创建假表。

  2. 在表中插入测试数据。

  3. 创建预期表和实际表。

  4. 运行SP并把结果放到 "实际 "表中。

  5. 比较 "预期 "和 "实际 "表。

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]'

插入或更新或删除

  1. 创建假表。
  2. 插入测试数据到表。
  3. 创建预期和实际的表。
  4. 运行SP。
  5. 将原始表中被修改的记录复制到实际表中。
  6. 比较 "预期 "和 "实际 "表。

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编写自动化测试是一个很好的选择,可以很早很有效地测试它们。