有没有一个类似dbunit的框架对java/scala来说不糟糕?

2022-08-31 15:31:32

我正在考虑制作一个新的,轻量级的数据库人口框架。我绝对讨厌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] 转换为实际 null 值的合理默认值。您必须手动添加它。告诉我,谁没有用dbunit做过这个?每个人都有。它不应该是这样的!

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

有什么可以满足我的东西,或者我应该成为一个更好的数据库测试框架的下一个框架开发人员吗?


答案 1

我不知道DbUnit有任何真正的替代品,@Joe提到的工具在我眼中都没有:

  • 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 提供了透明地处理约束的支持,请参阅禁用约束和更新序列

  1. XML 编写起来很痛苦。我不需要多说这个。他们还提供了很多方法来做到这一点,我认为这只会使事情复杂化。只需提供一种真正可靠的方法并完成它。

我想疼痛是主观的,但我不认为它很痛苦,尤其是在使用架构和自动完成时。你建议的银弹是什么?

  1. 当数据变大时,跟踪ID及其一致/正确的关系是一种皇家痛苦。

保持小,这是一个已知的最佳实践。你违背了一个已知的最佳实践,然后抱怨......

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

是的,任务切换会适得其反。但是,由于您正在处理低级数据,因此您必须知道它们是如何表示的,除非您使用更高级别的API,否则没有神奇的解决方案(但这不是DbUnit的目的)。

  1. 它很慢。我发现,除非使用hsqldb,否则它的速度非常慢。它不一定是。还有很多方法可以搞砸其配置,因为“开箱即用”并不容易。有一个驼峰,你必须经历才能让它正常工作。所有这一切都鼓励人们不要使用它,或者当他们开始使用它时感到生气。

这是数据库和JDBC固有的,而不是DbUnit。如果你想让事情尽可能快,请使用像H2这样的快速数据库(如果你有更好的不可知论方法来做事,我会很高兴了解它)。

  1. 可能最令人讨厌的是,第一个条目必须包含所有值 - 甚至是空占位符 - 否则未来的行不会选择您实际指定的列。

当使用Unitils时,如Unitils - Home - JavaPolis 2008Unit testing:unitils & dbmaintain等演示文稿中提到的那样。

有什么可以满足我的东西,或者我应该成为一个更好的数据库测试框架的下一个框架开发人员吗?

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


答案 2

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

我不打算回答你的观点,因为你的问题与DbUnit无关,而是与DbUnit的替代方案有关。无论如何,我只想强调你的第7点是完全错误的:你不需要再指定第一行上的所有列,这个功能被称为列感知。我不打算告诉你为什么默认情况下没有启用它,因为你肯定足够聪明,可以自己理解它。

我将对scaladbtest进行深入的检查,希望我们能够整合他们的想法。


推荐