是否有一个类似dbunit的框架不会吸引java / scala?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (74)

我正在考虑制定一个新的轻量级数据库人口框架。我绝对讨厌dbunit。在我做之前,我想知道是否有人已经做到了。

我不喜欢dbunit的东西:

1)不建议使用最简单的写入和开始格式。他们希望你使用臃肿的格式。有些甚至需要xml模式。好吧,无所谓了。

2)它们不是按照你写的顺序填充行,而是按照顺序表定义在xml文件中。这非常糟糕,因为您无法以外键约束不会导致问题的方式排序数据。这只会迫使你去完成关闭它的麻烦。

这也浪费时间并且使你的junit基类膨胀,以包含禁用外键约束的代码。您可能必须测试数据库类型(hsqldb等)并以特定于数据库的方式禁用它们。这太糟糕了。

如果dbunit帮助自动禁用外键约束作为其框架的一部分,可能会更好,但他们不会这样做。他们确实跟踪方言...所以为什么不使用它们呢?最终,所有这些都会迫使程序员浪费时间,而不是快速起立和测试。

3)XML是一个很难写的东西。我不需要多说这些。他们还提供了很多方法来做到这一点,我认为这只会让问题复杂化。只要提供一个非常可靠的方法,并完成它。

4)当你的数据变大时,跟踪ID和他们一致/正确的关系是一个皇家的痛苦。

另外,如果你不在一个月的项目上工作,你怎么记住user_id 1是一个管理员,user_id 2是一个商业用户,user_id 3是一个工程师,user_id 4是其他东西?回去检查这是浪费更多时间。应该有一种有意义的方式来检索它,而不是任意数字。

5)速度很慢。我发现,除非使用hsqldb,否则它会非常缓慢。它不一定是。也有很多方法搞砸了它的配置,因为“开箱即用”并不容易。有一个驼峰,你必须通过正确的工作。所有这些都鼓励人们不要使用它,或者在他们开始使用它时激怒他们。

6)有些价值倾向于重复很多,喜欢日期。如果指定默认值,甚至让框架自动放置默认值,即使没有告诉它将默认值放在那里,也不错。这样你就可以用你想要的值创建对象,并把其余的关掉。如果不需要,这肯定会指定列的每个角落和裂缝。

7)可能最令人讨厌的是第一个条目必须包含所有的值 - 甚至是空占位符 - 或者将来的行不会选择您实际指定的列。

DBunit没有将[NULL]转换为真实空值的合理默认值。你必须手动添加它。告诉我,谁没有使用dbunit做到这一点?每个人都有。它不应该是这样的!

这意味着如果你有一个多态对象,你必须将所有外键声明为第一行中每个子类的连接表,即使它们为空。如果你为所有的子类型做一个表格,你仍然必须指定第一行的所有字段。这太糟糕了。

为了满足我的需求,还是应该成为更好的数据库测试框架的下一个框架开发人员?

提问于
用户回答回答于

我没有意识到任何DbUnit的真正替代方案,所有工具都不在我眼中:

  • Incanto:不是DB不可知的
  • SQLUnit:用于测试数据库存储过程的回归和单元测试工具(这不是DbUnit的重点)
  • Cactus:用于容器内测试的工具(我没有看到它对数据库有帮助的地方)
  • Liquibase:数据库迁移工具(不加载/验证数据)
  • ORMUnit:可以初始化一个数据库,但仅此而已
  • JMock:根本不与DbUnit竞争
  • 话虽如此,我个人几次在小型和大型项目上成功地使用过DbUnit,而且我发现它非常实用,特别是在使用Unitils及其DbUnit模块时。这并不意味着它是完美的,不能改进,但有了体面的工具(无论是自定义的还是类似Unitils的),使用它都是体面的体验。

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

1)不建议使用最简单的写入和开始格式。他们希望你使用臃肿的格式。有些甚至需要xml模式。好吧,无所谓了。

DbUnit支持平面或结构化的XML,XLS,CSV。你想使用什么革命性的格式?顺便说一下,使用XML时,DTD或模式不是强制性的。但是它会给你提供诸如验证和自动完成之类的好东西,那又怎么样?Unitils可以为您轻松生成它,请参阅生成数据库结构的XSD或DTD

如果dbunit帮助自动禁用外键约束作为其框架的一部分,可能会更好,但他们不会这样做。他们确实跟踪方言...所以为什么不使用它们呢?最终,所有这些都会迫使程序员浪费时间,而不是快速起立和测试。

他们正在等待你的补丁。

同时,Unitils提供支持以透明地处理约束,请参阅禁用约束和更新序列

3)XML是一个很难写的东西。我不需要多说这些。他们还提供了很多方法来做到这一点,我认为这只会让问题复杂化。只要提供一个非常可靠的方法,并完成它。

我猜疼痛是主观的,但我觉得不痛,特别是在使用模式和自动完成时。什么是你建议的银弹?

4)当你的数据变大时,跟踪ID和他们一致/正确的关系是一个皇家的痛苦。

让他们小,这是一个知道的最佳做法。你违背了已知的最佳做法,然后抱怨...

另外,如果你不在一个月的项目上工作,你怎么记住user_id 1是一个管理员,user_id 2是一个商业用户,user_id 3是一个工程师,user_id 4是其他东西?回去检查这是浪费更多时间。应该有一种有意义的方式来检索它,而不是任意数字。

是的,任务切换是反生产力的。但是由于您使用的是低级数据,因此您必须知道它们是如何表示的,除非您使用更高级别的API(当然这不是DbUnit的目的),否则就没有神奇的解决方案。

5)速度很慢。我发现,除非使用hsqldb,否则它会非常缓慢。它不一定是。也有很多方法搞砸了它的配置,因为“开箱即用”并不容易。有一个驼峰,你必须通过正确的工作。所有这些都鼓励人们不要使用它,或者在他们开始使用它时激怒他们。

这是数据库和JDBC固有的,而不是DbUnit。如果你想让事情尽可能快(如果你有一个更好的不可知论的方式来做事情,我会很乐意去了解它),那么就使用像H2这样的快速数据库。

6)最令人讨厌的可能是第一个条目必须包含所有的值 - 甚至是空占位符 - 或者将来的行不会选择您实际指定的列。

Unitils - Home - JavaPolis 2008单元测试:unitils&dbmaintain等演示文稿中提到使用Unitils时,不要使用Unitils

为了满足我的需求,还是应该成为更好的数据库测试框架的下一个框架开发人员?

如果您认为自己可以做得更好,也许可以为现有解决方案做出贡献。如果这是不可能的,如果你认为你可以创建杀手级数据库测试框架,我可以说,做到这一点。但别忘了,咆哮很容易,想出解决方案并不是那么简单。

用户回答回答于

作为一名DbUnit开发人员,我很感激批评,我必须部分同意你的意见。我们正在开始设计下一个DbUnit主要版本,我希望邀请您参与讨论和开发。

我不会回答你的观点,因为你的问题并不是真正与DbUnit相关,而是与DbUnit的选择有关。无论如何,我只想强调你的观点7是完全错误的:你不需要再指定第一行的所有列,该特征被称为列感测。我不会告诉你为什么它没有默认启用,因为你确实很聪明,可以自己理解它。

扫码关注云+社区