我在考虑做一个新的,轻量级的数据库人口框架。我非常讨厌dbunit。在此之前,我想知道是否有人已经这么做了。
我不喜欢dbunit的地方:
1)不推荐使用编写和入门最简单的格式。他们希望你使用臃肿的格式。有些甚至需要xml模式。是啊,管他呢。
2)它们填充行的顺序不是按照您编写的顺序,而是按照表在xml文件中定义的顺序。这真的很糟糕,因为您不能以外键约束不会导致问题的方式对数据进行排序。这只会迫使你经历完全关闭它们的麻烦。
这还会浪费时间,并使您的junit基类变得臃肿,从而包含禁用外键约束的代码。您可能需要测试数据库类型(hsqldb等)。并以特定于数据库的方式禁用它们。这太糟糕了。
如果dbunit帮助禁用外键约束作为其框架的一部分,情况会更好,但它们不会这样做。他们确实记录了方言。那么为什么不把它们用在这上面呢?归根结底,所有这些都会迫使程序员浪费时间,不能快速启动和测试。
3)编写XML是一件痛苦的事情。关于这一点,我不需要多说。他们还提供了如此多的方法来做这件事,我认为这只会让事情变得复杂。只需提供一种非常可靠的方法,并完成它。
4)当您的数据变得很大时,跟踪ids及其一致/正确的关系是一件非常痛苦的事情。
另外,如果你在一个项目上没有工作一个月,你怎么记得user_id 1是管理员,user_id 2是商业用户,user_id 3是工程师,user_id 4是其他东西?回去检查这是在浪费更多的时间。应该有一种有意义的方法来检索它,而不是一个任意的数字。
5)它很慢。我发现除非使用hsqldb,否则它会非常慢。这并不是必须的。还有许多方法可以搞乱它的配置,因为“开箱即用”并不容易。为了让它正常工作,你必须经历一个驼峰。所有这些都是鼓励人们不要使用它,或者当他们开始使用它时被激怒。
6)有些值往往会重复很多次,比如日期。最好指定默认值,甚至让框架自动放入默认值,即使您不告诉它放入默认值也是如此。这样,您就可以只使用所需的值创建对象,而不使用其他值。这肯定胜过在不需要的情况下指定列的每一个角落和缝隙。
7)最烦人的事情可能是第一个条目必须包括所有值-甚至是空占位符-否则将来的行将不会选择您实际指定的列。
DBunit也没有一个合理的默认值来将NULL转换为真正的NULL值。您必须手动添加它。告诉我,谁没有用dbunit做到这一点?每个人都有。事情不应该是这样的!
这意味着如果您有一个多态对象,您必须声明第一行中每个子类的连接表的所有外键,即使它们是null。如果您为所有子类模式创建了一个表,那么您仍然需要指定第一行上的所有字段。这太可怕了。
有没有什么能让我满意的,或者我应该成为下一个更好的数据库测试框架的框架开发人员?
发布于 2010-11-04 06:18:59
作为一名DbUnit开发人员,我很感谢批评,我必须部分同意您的观点。我们目前正在开始设计下一个DbUnit的主要版本,我希望邀请您参与讨论和开发。
我不会回答你的观点,因为你的问题实际上与DbUnit无关,而是与DbUnit替代方案有关。无论如何,我只想强调您的观点7是完全错误的:您不再需要指定第一行上的所有列,该功能称为列感知。我不会告诉你为什么默认情况下没有启用它,因为你肯定足够聪明,可以自己理解它。
我将对scaladbtest进行深入研究,希望我们能整合他们的想法。
发布于 2013-04-08 23:56:30
面对使用DBUnit的类似问题,我找到了这个:http://dbsetup.ninja-squad.com/index.html,它可以解决问题。例如,所有DB内容都包含在java类本身中,而不是在单独的文件中表示测试数据。
发布于 2010-10-17 06:09:26
我使用DBUnit,使用一些包装器来平滑粗糙的边缘。可以补充或重叠功能的一个很好的工具是Jailer。它可以从参考数据库中提取数据子集,并将其存储为与DBUnit兼容的XML文件,或者存储为“拓扑排序的DML文件”,这符合外键约束。
https://stackoverflow.com/questions/3950002
复制相似问题