我是一名 SQL Server DBA。为了自动化我的一些日常任务,我需要编写存储过程。在没有测试的情况下创建功能对我来说没有意义。为了创建和运行我的测试,我使用了 tSQLt 框架。
我必须在测试期间创建一个数据库。在多语句事务中不允许“创建数据库”,但所有测试都会在 tSQLt 框架内的事务中自动运行。
当然,我可以在运行测试之前手动设置一个测试数据库,但测试不能依赖于它将执行的环境。
应该如何处理?
我是一名 SQL Server DBA。为了自动化我的一些日常任务,我需要编写存储过程。在没有测试的情况下创建功能对我来说没有意义。为了创建和运行我的测试,我使用了 tSQLt 框架。
我必须在测试期间创建一个数据库。在多语句事务中不允许“创建数据库”,但所有测试都会在 tSQLt 框架内的事务中自动运行。
当然,我可以在运行测试之前手动设置一个测试数据库,但测试不能依赖于它将执行的环境。
应该如何处理?
最新版本的tSQLt允许在事务之外运行测试。文档有点欠缺(如:尚未编写),但基本上您只需要
@tSQLt:NoTransaction
在测试中添加注释即可。这是 tSQLt 本身的测试示例:
--@tSQLt:NoTransaction('MyInnerTests.TestCleanUp')
单个参数是一个将在测试之后执行的过程,即使测试本身出错或失败。你应该用它来清理自己。请记住,没有事务保护您,因此您需要小心撤消您在数据库/服务器上更改的所有内容。tSQLt 将自行清理测试用例,其他一切都由您自己决定。
还要记住,您的测试应该是幂等的,这意味着无论它尝试创建的数据库是否已经存在,它都需要能够执行,所以如果该逻辑不是您测试过程的一部分,您需要向测试添加逻辑以删除数据库(如果存在)。这导致了接下来要考虑的事情:如果由没有经验的同事执行,您需要以一种最小化损坏概率的方式编写测试。这意味着在这种情况下,不要使用在生产中用于这些测试的数据库名称。