微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.net – 在数据库上运行测试的策略

我已经开始研究一个包含1800多个功能/集成测试的现有项目.这些都是用MSTest编码的.

其中许多直接连接到sql Server数据库.数据库代码生成生成,代码生成器在许多方面创建数据库.生成数据库很慢而且很麻烦.

这有以下问题:

>测试清理db,这意味着我们必须为测试维护一个单独的db,而另一个使用该应用程序.现在的过程是在运行测试和运行应用程序之间进行更改时更改数据库.
>每个分支都需要拥有自己的数据库,因为每个数据库中的数据库模型可能不同(这意味着每个分支有2个数据库,步骤1)
>这很慢
>必须存在sql Server和db的安装才能运行测试

我希望现有的测试不依赖于这样的安装,如果可能的话运行得更快,而不必通过代码生成器,杂耍连接字符串等来处理维护数据库.

我试图尽快实现这一点,因为重写测试不在预算范围内.我已经引入了模拟来帮助新测试减少对数据库的依赖,我现在的问题是现有的测试.

我的第一个问题是将我们的基本单元测试类更改为连接到sqlite数据库,该数据库将由代码生成器创建,该代码生成器已生成数据库而不是sql Server数据库.然后可以删除sqlite并在每次运行之间重新复制到测试文件夹.这本来很快,不需要2个sql Server数据库,事实上如果只是运行测试,则不需要sql Server安装.

我的问题是生成代码使用了sqlite中没有包含的许多概念; T-sql,sql Server特定语法,模式,存储过程和嵌入式clr程序集.

然后我尝试了sql Server CE 4,它有许多与sqlite相同的限制.

除了重写代码以与sqlite(或CE)兼容,重写现有测试或我们维护2 seperatedb的系统之外,还有其他可用的替代方案吗?

编辑:将单元测试更改为功能测试,澄清了一些事情.把一些东西放大胆.
我同意这些测试不是适当的单元测试.我同意嘲笑在这里会很好.我想要做的是尝试解决我面临的混乱局面.

解决方法

如果要连接到数据库或任何其他资源,则不是单元测试.适当的单元测试被隔离到被测单元或您的班级.应该嘲笑被测单元之外的任何东西.

我不是.NET开发人员所以我不能推荐最好的Mocking框架/工具,但也许是this question will point you in the right direction.

为什么单元测试不应该访问资源:

你会想要以不同的方式看待这个问题.您没有任何测试数据库本身的愿望,因为您必须假设您正在使用的数据库产品正常工作.因此,没有必要测试“$dao-> save()”实际插入记录.您可能感兴趣的是在完成某些其他操作时是否正在调用save()方法,或者您的DAO是否生成了正确的INSERT语句.

如果你必须在单元测试中进行数据库调用,因为你不能模拟进行数据库调用的对象,你需要重构.

肥皂盒时间:

这就是测试驱动开发如此有益的原因.从一开始就强调要保持脱钩和隔离,从而带来更好的整体设计,灵活性和可测试性.

原文地址:https://www.jb51.cc/mssql/78018.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐