我在考虑创建一个新的、轻量级的数据库总体框架.我绝对讨厌dbunit.在我这么做之前,我想知道是否有人已经这么做了.

关于dbunit我不喜欢的事情:

1)不推荐使用编写和入门最简单的格式.他们希望您使用臃肿的格式.有些甚至需要XML模式.是啊,管他呢.

2)它们填充行的顺序不是按照您编写的顺序,而是按照表在XML文件中定义的顺序.这真的很糟糕,因为您不能以外键约束不会导致问题的方式对数据进行排序.这只会迫使您经历彻底关闭它们的麻烦.

这还会浪费时间,并使您的junit基类inflating ,使其包含禁用外键约束的代码.您可能需要测试数据库类型(hsqldb等).并以特定于数据库的方式禁用它们.这太糟糕了.

如果dbunit帮助将外键约束作为其框架的一部分自动禁用,那会更好,但它们不会这样做.他们确实记录了方言.那么为什么不把它们用来做这个呢?最终,所有这些都会迫使程序员浪费时间,不能快速启动和测试.

3)XML编写起来很麻烦.关于这件事我不需要多说.他们还提供了如此多的方法来做这件事,我认为这只会让事情变得复杂.只要提供一个非常可靠的方法就可以了.

4)当您的数据变得很大时,跟踪ID及其一致/正确的关系是一件非常痛苦的事情.

此外,如果您在一个月内没有处理某个项目,如何才能记住user_id1是管理员,user_id2是业务用户,user_id3是工程师,而user_id4是其他东西呢?回go 判断这是在浪费更多的时间.应该有一种有意义的方式来检索它,而不是任意的数字.

它很慢.我发现,除非使用hsqldb,否则它非常慢.不一定非得这样.由于"开箱即用"并不容易,因此也有很多方法来搞乱它的配置.要让它正常工作,你必须经历一个坎坷.所有这些都是鼓励人们不要使用它,或者当他们真的开始使用它时被激怒.

6)有些值往往会重复很多,比如日期.最好指定默认值,甚至让框架自动放入默认值,即使您不告诉它放入默认值也是如此.这样,您就可以只使用所需的值创建对象,而不使用睡觉.如果不需要,这肯定比指定列的每一个角落和缝隙要好.

7) 可能最烦人的是,第一个条目必须包含所有的值——即使是空占位符——否则future 的行将不会 Select 您实际指定的列.

DBunit也没有将[NULL]转换为真正的NULL值的合理缺省值.您必须手动添加.告诉我,谁没有用dbunit这样做过?每个人都有.事情不应该是这样的!

这意味着如果您有一个多态对象,则必须声明第一行每个子类的连接表的所有外键,即使它们为空.如果您为所有子类模式创建了一个表,则仍然需要指定第一行上的所有字段.这太可怕了.

有什么能让我满意的吗,或者我应该成为下一个更好的数据库测试框架的框架开发者吗?

推荐答案

我没有意识到DbUnit有任何真正的替代品,@Joe中提到的工具在我看来都不存在:

  • Incanto:与数据库无关
  • SQLUnit:用于测试数据库存储过程的回归和单元测试工具(这与DbUnit无关)
  • Cactus:用于容器内测试的工具(我看不出它对数据库有什么帮助)
  • Liquibase:数据库迁移工具(不加载/验证数据)
  • ORMUnit:可以初始化数据库,但仅此而已
  • JMock:根本不与DbUnit竞争

话虽如此,我个人已经在小型和大型项目上成功地使用了好几次DbUnit,我发现它非常有用,尤其是在使用Unitils及其DbUnit模块时.这并不意味着它是完美的,无法改进,但有了像样的工具(定制或类似Unitils的东西),使用它是一种像样的体验.

所以,让我来回答你的一些观点:

  1. 最简单的编写和入门格式已被弃用.他们希望你使用臃肿的格式.有些甚至需要xml模式.是的,随便了.

DbUnit支持平面或 struct 化XML、XLS、CSV.您想使用哪种革命性的格式?顺便说一句,在使用XML时,DTD或模式不是必需的.但是它提供了验证和自动完成这样的好东西,这有什么不好呢?Unitils可以很容易地为您生成它,请参见Generate an XSD or DTD of the database structure.

如果dbunit帮助将外键约束作为其框架的一部分自动禁用,那会更好,但它们不会这样做.他们确实记录了方言.那么为什么不把它们用来做这个呢?最终,所有这些都会迫使程序员浪费时间,不能快速启动和测试.

他们在等你的补丁.

同时,Unitils提供了透明地处理约束的支持,参见Disabling constraints and updating sequences.

  1. XML编写起来很麻烦.关于这件事我不需要多说.他们还提供了如此多的方法来做这件事,我认为这只会让事情变得复杂.只要提供一个非常可靠的方法就可以了.

我想痛苦是主观的,但我并不觉得痛苦,特别是在使用模式和自动完成时.你建议的灵丹妙药是什么?

  1. 当您的数据变得很大时,跟踪ID及其一致/正确的关系是一件非常痛苦的事情.

把它们弄小,那就是best practice美元.你违背了已知的最佳实践,然后抱怨.

此外,如果您在一个月内没有处理某个项目,如何才能记住user_id1是管理员,user_id2是业务用户,user_id3是工程师,而user_id4是其他东西呢?回go 判断这是在浪费更多的时间.应该有一种有意义的方式来检索它,而不是任意的数字.

是的,任务切换会适得其反.但是因为您使用的是低级数据,所以您必须知道它们是如何表示的,当然,除非您使用高级API(但这不是DbUnit的目的),否则没有神奇的解决方案.

  1. 很慢.我发现,除非使用hsqldb,否则它的速度非常慢.不一定是这样.还有很多方法可以搞乱它的配置,因为"开箱即用"并不容易.要使它正常工作,你必须经历一个困难.所有这一切都是为了鼓励人们不要使用它,或者当他们开始使用它时感到愤怒.

这是数据库和JDBC的固有特性,而不是DbUnit.如果你想让事情尽可能快的话,可以使用像H2这样的快速数据库(如果你有更好的不可知论方法,我很乐意了解它).

  1. 可能最烦人的是,第一个条目必须包括所有值-甚至空占位符-否则将来的行将不会 Select 您实际指定的列.

在像Unitils - Home - JavaPolis 2008Unit testing: unitils & dbmaintain这样的演示文稿中提到的使用Unitil时就不会了.

有什么能让我满意的吗,或者我应该成为下一个开发更好的数据库测试框架的框架开发人员吗?

如果你认为你可以让事情变得更好,也许可以对现有的解决方案做出贡献.如果这是不可能的,如果你认为你可以创建杀手数据库测试框架,我能说什么,做它.但别忘了,咆哮很容易,用自己的解决方案想出解决方案就不那么容易了.

Database相关问答推荐

在MongoDB的树形 struct 中更新具有给定id的元素

是否可以同时从 RocksDB 读取?

mongodb聚合从另一个查询中获取值

时间数据库设计,有一个转折(live vs draft rows)

Objective-C中是否有类似于LINQ的东西?

用于存储食谱的数据库设计

查询最后一天、上周、上个月SQLite

数据库中空值(nulls)使用的空间

使用varchar作为主键?

没有自动增量的sqlalchemy主键

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

我应该将用户 ID 公开吗?

如何一次插入1000行

如何在android中使用合同类?

PostgreSQL 的示例数据库

将文本列设为唯一键

如何删除除了postgres中的少数数据库之外的所有数据库

标准化人类皮肤 colored颜色 以进行用户交互

单元测试数据库

数据库 - (行或记录、列或字段)?