我正在为一个使用数据库的应用程序编写单元测试,我希望能够针对一些样本/测试数据运行该应用程序-但我不确定为测试设置初始测试数据的最佳方式.

我正在寻找的是一种方法,可以在调试时针对我当前使用的同一数据库(或原理图相同的数据库)运行测试中的代码——在每次测试之前,我希望确保在插入测试数据之前,将数据库重置为干净的状态.

我意识到使用IRepository模式将允许我消除针对实际数据库进行测试的复杂性,但我不确定在我的情况下是否可能做到这一点.

有什么建议或文章可以为我指明正确的方向吗?

谢谢!

--编辑--

谢谢大家,这些都是很棒的建议!我可能会模仿我的数据访问层,结合一些简单的设置类来准确地生成每次测试所需的数据.

推荐答案

以下是我try 使用的一般方法.我设想的测试大约有三到四个级别:单元测试、交互测试、集成测试、验收测试.

在单元测试级别,这只是代码.任何数据库交互都是模拟的,无论是手动还是使用流行的框架之一,因此加载数据不是问题.它们运行得很快,并确保对象按预期工作.这允许非常快速的写-测试/写代码/运行测试周期.模拟对象提供每个测试所需的数据.

交互测试测试非平凡类交互的交互.同样,不需要数据库,它是模拟的.

现在在集成级别,我正在测试组件的集成,这就是真正的数据库、队列、服务、yada-yada的所在.如果可以,我将使用一种流行的内存数据库,因此初始化不是问题.它总是以空开始,我使用实用程序类来清理数据库,并在每次测试之前加载我想要的数据,这样测试之间就没有耦合.

我在使用内存数据库时遇到的问题是,它们通常不支持我需要的所有功能.例如,也许我需要一个外部联接,而内存中的DB不支持这个.在这种情况下,我通常会对本地传统数据库(如MySQL)进行测试,再次在每次测试之前对其进行清理.由于该应用程序是在一个单独的环境中部署到生产环境中的,因此测试周期不会影响这些数据.

Database相关问答推荐

postgres 索引扫描的启动成本(postgresql 书的内部 struct )

什么是范围锁( range-locks)?

如何将 Grails 3.0 连接到我的本地 Mysql 数据库

在 model.save() 中处理竞争条件

复制 MySQL 数据库的最简单方法?

如何使用 SELECT WHERE IN() 保持订单?

Entity Framework:如何检测对数据库的外部更改

如何在 Products 表的主键和自然键之间做出决定?

文件访问速度与数据库访问速度

Oracle (ORA-02270) : no matching unique or primary key for this column-list error

如何取消长时间运行的数据库操作?

MongooseJS - 如何找到具有最大值的元素?

在数据库字段中存储数字数组

谁有维基数据库?

在 SQLite 数据库中加入 3 个表

使用 PHP/PDO 判断数据库表是否存在

多币种 - 存储什么以及何时转换?

使用 liquibase 更新表中的一行

数据库效率 - 每个用户的表与用户表

列的 SQL Server 2008 千位分隔符