編寫單元測試來測試代碼是編程中不可避免的做法。測試存儲過程與其他代碼一樣重要。SP通常是手動測試的,我們避免添加自動化測試。在敏捷環境中,未經測試的代碼在某些時候容易出現缺陷。在本文中,讓我們了解一下tsqlt框架——一個用于SQL Server的開源數據庫單元測試框架。
先決條件将您的編輯器附加到正在運行的數據庫。數據庫可以在本地、雲或任何虛拟機中運行。
創建一個新的測試類,如下所示。在附加的 DB 會話中運行它會在 DB 中創建一個測試對象。我們将在此對象中添加所有測試腳本(SP)。
SQL1執行 tsqlt .NewTestClass 'EMPLOYEE'2去
注意新創建的對象内的測試。我們将在下面詳細閱讀測試。我們現在都準備好編寫測試了。
下面是我們将在本文中看到的示例的表格詳細信息和 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 編寫不同結構的測試。兩者沒有重大區别,但在填充預期表和實際表方面有一個簡單的區别。
對于選擇:
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]'
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 編寫自動化測試是非常早且高效地測試它們的好選擇。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!