Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SQLServer2008中实现数据库测试驱动开发的最佳方法是什么_C#_Sql Server 2008_Tdd_Fitnesse - Fatal编程技术网

C# 在SQLServer2008中实现数据库测试驱动开发的最佳方法是什么

C# 在SQLServer2008中实现数据库测试驱动开发的最佳方法是什么,c#,sql-server-2008,tdd,fitnesse,C#,Sql Server 2008,Tdd,Fitnesse,我正在开发一个解决方案,以实现数据库测试驱动开发,用于测试存储过程更改。到目前为止,我的想法是执行存储过程,并以原始格式存储预期的数据和模式结果集。更改sp,然后再次执行存储的过程,并断言模式和数据相等 第一次,我将数据存储在sql server数据库中,如下所示:- testdata.storedproc ID-int 结果集-int 数据XML 日期-日期时间 testschema.storedproc ID-int。 结果集-int。 模式XML。 日期-日期时间。 一切都进行得很顺利,直

我正在开发一个解决方案,以实现数据库测试驱动开发,用于测试存储过程更改。到目前为止,我的想法是执行存储过程,并以原始格式存储预期的数据和模式结果集。更改sp,然后再次执行存储的过程,并断言模式和数据相等

第一次,我将数据存储在sql server数据库中,如下所示:-

testdata.storedproc

ID-int 结果集-int 数据XML 日期-日期时间 testschema.storedproc

ID-int。 结果集-int。 模式XML。 日期-日期时间。 一切都进行得很顺利,直到我发现一个导致我头痛的存储过程:-

存储过程:-

具有多个结果集。 具有包含相同列名的列,即person.name、area.name。 具有包含非法xml字符的数据。 结果超过120000行。
这打破了我最初的想法,是否有人愿意分享任何关于数据库测试驱动开发的知识,或者有其他可能有用的解决方案?

我已经成功地将DbFit库与Fit/Fitnesse结合使用,以测试优先的方式开发存储过程。测试是用HTML编写的,可以作为独立文件Fit或Wiki页面FitNesse。DbFit管理数据库连接,执行查询和存储过程,并且默认情况下将每个单独的测试包装在事务中,以帮助保持事情的可重复性


有关Fit/Fitnesse的更多信息,请参阅StackOverflow上的和此处标记的问题。可以在上找到DbFit。

我已经成功地将DbFit库与Fit/Fitnesse结合使用,以测试优先的方式开发存储过程。测试是用HTML编写的,可以作为独立文件Fit或Wiki页面FitNesse。DbFit管理数据库连接,执行查询和存储过程,并且默认情况下将每个单独的测试包装在事务中,以帮助保持事情的可重复性

有关Fit/Fitnesse的更多信息,请参阅StackOverflow上的和此处标记的问题。DbFit可在上找到。

测试数据存储解决方案

您将使用一种简单的原始存储格式,正如您所发现的,当存储过程可以在整个关系数据库中自由运行时,这种格式并没有多大帮助

相反,您应该将每个测试的结果集保留在数据库中。然后将该数据库中的数据与您设置的另一个结果数据库进行比较,或者将其与能够在多个表中表示多行和多列数据的简单数据格式进行比较

您可以将预期的测试结果数据编写为DML(可能是从实际数据库中提取的),这是一种可以处理更复杂数据模式的自定义Xml格式,或者只需在自定义结果集数据库上执行数据库备份/恢复

就我个人而言,我会尝试通过使用自定义的仅测试实体框架或NHibernate模型来导入模式,但不导入任何存储过程,或者任何可能使我的测试更困难的内容,并使用CreateDatabase功能来部署模式进行测试。然后可以利用.Net代码存储引用数据对象初始值设定项、用于提取和比较数据的ORM以及NUnit。这与我下面的头脑风暴非常吻合

我就你更高层次的问题进行了一些头脑风暴

理想情况下,测试用例将单独测试逻辑。因为不能真正拆分单个存储过程,所以至少可以单独运行它

下面是实现存储过程测试所需的一般说明。请注意,我所说的这些都是从DB的角度来看的,但是您可以用任何使您的工具和测试用例更易于编写、理解和维护的东西来替换其中的一些

零件

输入数据

存储过程引用的最小精简模式 其中一部分是使存储过程得以编译的最小DDL 另一部分是为这个测试用例提供存储过程的最小DML 当前存储过程引用的任何存储过程的精简模拟版本 要输入存储过程参数的数据 要测试的存储过程的脚本 输出数据

存储过程涉及的每个表的预期最终数据集 这只是针对早期模式运行的第二组DML 存储过程返回的预期数据集 工具

要针对其运行测试用例的空架构 用于将预期结果推送到以进行比较的空架构 用于比较测试断言表之间数据的工具或脚本 其中一些可以在同一存储过程的测试用例之间共享。您可以共享模式DDL,可能是一些DML,以及为每个测试设置/执行/比较/清理的逻辑

执行

安排

创建测试下的架构,它将开始为空 运行DDL脚本 运行初始DML脚本 创建模拟存储过程 创建测试中的存储过程 法案

执行测试中的存储过程,并将结果集存储在另一个表中?一套桌子? 断言

为结果创建第二个空模式 运行DDL脚本 运行预期的DML脚本 是否可能将存储过程的返回结果复制到此新架构中的新表? 在两个模式之间运行比较脚本,并输出比较是否成功数据是否相同数据中是否存在任何差异。 出于诊断目的,数据应该是相同的,或者应该输出一个不错的错误,告诉您差异是什么。 测试数据存储解决方案

您将使用一种简单的原始存储格式,正如您所发现的,当存储过程可以在整个关系数据库中自由运行时,这种格式并没有多大帮助

相反,您应该将每个测试的结果集保留在数据库中。然后将该数据库中的数据与您设置的另一个结果数据库进行比较,或者将其与能够在多个表中表示多行和多列数据的简单数据格式进行比较

您可以将预期的测试结果数据编写为DML(可能是从实际数据库中提取的),这是一种可以处理更复杂数据模式的自定义Xml格式,或者只需在自定义结果集数据库上执行数据库备份/恢复

就我个人而言,我会尝试通过使用自定义的仅测试实体框架或NHibernate模型来导入模式,但不导入任何存储过程,或者任何可能使我的测试更困难的内容,并使用CreateDatabase功能来部署模式进行测试。然后可以利用.Net代码存储引用数据对象初始值设定项、用于提取和比较数据的ORM以及NUnit。这与我下面的头脑风暴非常吻合

我就你更高层次的问题进行了一些头脑风暴

理想情况下,测试用例将单独测试逻辑。因为不能真正拆分单个存储过程,所以至少可以单独运行它

下面是实现存储过程测试所需的一般说明。请注意,我所说的这些都是从DB的角度来看的,但是您可以用任何使您的工具和测试用例更易于编写、理解和维护的东西来替换其中的一些

零件

输入数据

存储过程引用的最小精简模式 其中一部分是使存储过程得以编译的最小DDL 另一部分是为这个测试用例提供存储过程的最小DML 当前存储过程引用的任何存储过程的精简模拟版本 要输入存储过程参数的数据 要测试的存储过程的脚本 输出数据

存储过程涉及的每个表的预期最终数据集 这只是针对早期模式运行的第二组DML 存储过程返回的预期数据集 工具

要针对其运行测试用例的空架构 用于将预期结果推送到以进行比较的空架构 用于比较测试断言表之间数据的工具或脚本 其中一些可以在同一存储过程的测试用例之间共享。您可以共享模式DDL,可能是一些DML,以及为每个测试设置/执行/比较/清理的逻辑

执行

安排

创建测试下的架构,它将开始为空 运行DDL脚本 运行初始DML脚本 创建模拟存储过程 创建测试中的存储过程 表演

执行测试中的存储过程,并将结果集存储在另一个表中?一套桌子? 断言

为结果创建第二个空模式 运行DDL脚本 运行预期的DML脚本 是否可能将存储过程的返回结果复制到此新架构中的新表? 在两个模式之间运行比较脚本,并输出比较是否成功数据是否相同数据中是否存在任何差异。 出于诊断目的,数据应该是相同的,或者应该输出一个不错的错误,告诉您差异是什么。
正如您所注意到的,测试存储过程的变化是巨大的。这不是你应该开发的东西,因为有太多的小案例无法记住或出现,而你并不期待。你可能想看看红门公司。我相信他们有可以做到这一点的工具。您所描述的是一组A/B测试,旨在实现回归测试套件。在真正的TDD中,您甚至可以在拥有存储过程之前开发测试用例。这将很难实现,因为模仿DB的某些部分不是很容易,就是不可能。但是您描述的测试类型也是重要和有用的。测试存储过程的变化是巨大的——正如您所注意到的。这不是你应该开发的东西,因为有太多的小案例无法记住或出现,而你并不期待。你可能想看看红门公司。我相信他们有工具可以做到这一点。你所描述的是一组A/B测试,旨在
完成一个回归测试套件。在真正的TDD中,您甚至可以在拥有存储过程之前开发测试用例。这将很难实现,因为模仿DB的某些部分不是很容易,就是不可能。但是你所描述的测试类型也很重要和有用。很好的答案。我认为另一个值得一提的是使用回滚的事务,包装整个测试运行,这样,如果它偶然地运行在一个实时数据库甚至QA数据库上,它就不会干扰现有数据。你认为这有可能吗?@jamiebarrow:我已经设置了权限和严格的程序,以确保在生产中不会运行任何不严格允许的内容。例如,将测试脚本与生产脚本分开,使DBA在部署时/在自动化运行以进行部署时,只有生产介质可以工作。事务无法回滚架构更改。从模式更改中回滚的唯一方法是从DB备份中恢复。回答得很好。我认为另一个值得一提的是使用回滚的事务,包装整个测试运行,这样,如果它偶然地运行在一个实时数据库甚至QA数据库上,它就不会干扰现有数据。你认为这有可能吗?@jamiebarrow:我已经设置了权限和严格的程序,以确保在生产中不会运行任何不严格允许的内容。例如,将测试脚本与生产脚本分开,使DBA在部署时/在自动化运行以进行部署时,只有生产介质可以工作。事务无法回滚架构更改。从架构更改回滚的唯一方法是从DB备份中恢复。