Database 测试存储过程';逻辑

Database 测试存储过程';逻辑,database,unit-testing,tsql,Database,Unit Testing,Tsql,我们在TSQL存储过程中有相当多的逻辑。作为自动化测试的忠实粉丝,我开始为存储过程编写自动化测试 我通过从C#项目调用存储过程来测试它们。我让所有涉及数据库的测试从基类继承,以确保测试在从未提交的TransactionScope中运行。有几个问题与此相关: -与不涉及数据库的测试相比,测试速度较慢,但我认为这方面的工作做得不多。 -有时,当我想让数据库处于运行测试逻辑之前所需的状态时,我会遇到FK问题。例如,当我需要截断FK引用的表时,您不能这样做。我还需要删除引用表中的行。 -有时我需要编写一

我们在TSQL存储过程中有相当多的逻辑。作为自动化测试的忠实粉丝,我开始为存储过程编写自动化测试

我通过从C#项目调用存储过程来测试它们。我让所有涉及数据库的测试从基类继承,以确保测试在从未提交的TransactionScope中运行。有几个问题与此相关:
-与不涉及数据库的测试相比,测试速度较慢,但我认为这方面的工作做得不多。
-有时,当我想让数据库处于运行测试逻辑之前所需的状态时,我会遇到FK问题。例如,当我需要截断FK引用的表时,您不能这样做。我还需要删除引用表中的行。
-有时我需要编写一个新的存储过程或查询,以使数据库进入您需要的状态。另一方面,我经常发现我需要一个类似的程序后,新的功能无论如何


尽管有这些缺点,我仍然选择为存储过程逻辑编写测试,因为存储过程中有相当多的逻辑。您是否使用类似的方法,完全不同的方法(如TSqlUnit),或者您不必麻烦测试存储过程?

我认为从代码测试存储过程有好处,因为它可以将所有测试保持在一个位置,以便在开发机器或构建机器上轻松运行

尽管这违反了单元测试原则(不是为每个测试设置和拆卸),但我使用数据库的一个副本专门用于测试,并使用一个脚本以我需要的方式设置数据。对于干净的测试数据库,可以根据需要重新运行此脚本。这样做的缺点是不断更新脚本,正如您提到的,外键是一种痛苦。我使用SQLServerManagementStudio插件为数据插入编写脚本,以简化此过程


我相信这就是我所使用的插件:

这是一个方便的列表,列出了为什么存储过程很痛苦却价值相对较低的原因。我曾经坚定地扎根于SP阵营,但我的想法已经改变了。CRUD的存储过程非常繁琐;使用或映射器和参数化内联查询时,存储过程似乎不那么重要。不幸的是,SPs是我必须使用的,我担心它不会改变。