Sql-Server

一些 DDL 查詢的 tSQLt 測試問題

  • June 21, 2022

我是一名 SQL Server DBA。為了自動化我的一些日常任務,我需要編寫儲存過程。在沒有測試的情況下創建功能對我來說沒有意義。為了創建和執行我的測試,我使用了 tSQLt 框架。

我必須在測試期間創建一個數據庫。在多語句事務中不允許“創建數據庫”,但所有測試都會在 tSQLt 框架內的事務中自動執行。

當然,我可以在執行測試之前手動設置一個測試數據庫,但測試不能依賴於它將執行的環境。

應該如何處理?

最新版本的tSQLt允許在事務之外執行測試。文件有點欠缺(如:尚未編寫),但基本上您只需要@tSQLt:NoTransaction在測試中添加註釋即可。

這是 tSQLt 本身的測試範例:

--@tSQLt:NoTransaction('MyInnerTests.TestCleanUp')

單個參數是一個將在測試之後執行的過程,即使測試本身出錯或失敗。你應該用它來清理自己。請記住,沒有事務保護您,因此您需要小心撤消您在數據庫/伺服器上更改的所有內容。tSQLt 將自行清理測試案例,其他一切都由您自己決定。

還要記住,您的測試應該是冪等的,這意味著無論它嘗試創建的數據庫是否已經存在,它都需要能夠執行,所以如果該邏輯不是您測試過程的一部分,您需要向測試添加邏輯以刪除數據庫(如果存在)。這導致了接下來要考慮的事情:如果由沒有經驗的同事執行,您需要以一種最小化損壞機率的方式編寫測試。這意味著在這種情況下,不要使用在生產中用於這些測試的數據庫名稱。

--[@tSQLt:NoTransaction]('MyTests.test1CleanUp')
CREATE PROCEDURE MyTests.[test1]
AS
BEGIN
 --Assemble

 --Act

 --Assert
 EXEC tSQLt.Fail 'More work to do here!';
END;

GO

CREATE PROCEDURE MyTests.[test1CleanUp]
AS
BEGIN
 --Undo anything that happened in MyTests.[test1]
 RAISERROR('TODO',16,10);
END;

引用自:https://dba.stackexchange.com/questions/313549