Mey*_*uie 2 sql-server t-sql tsqlt
我是一名 SQL Server DBA。为了自动执行一些日常任务,我需要编写存储过程。在没有测试的情况下创建功能对我来说没有意义。为了创建和运行我的测试,我使用了 tSQLt 框架。
我必须在测试期间创建一个数据库。多语句事务内不允许“CREATE DATABASE”,但所有测试都会在 tSQLt Framework 内的事务内自动运行。
当然,我可以在运行测试之前手动设置测试数据库,但测试不能依赖于执行它的环境。
应该如何处理这个问题?
最新版本的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;
Run Code Online (Sandbox Code Playgroud)