我当时正在考虑创建一个新的轻量级数据库填充框架。我绝对讨厌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完成此操作?每个人都有。不应该这样!
这意味着,如果您有一个多态对象,则必须声明第一行中每个子类的联接表的所有外键,即使它们为空。如果为所有子类模式创建表,则仍必须在第一行中指定所有字段。这太可怕了。
有什么让我满意的,还是我应该成为更好的数据库测试框架的下一个框架开发人员?
我不知道有什么真正的替代DbUnit的选择,@ Joe提到的工具都没有出现在我眼中:
话虽如此,我已经在大型和小型项目中成功地多次使用了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时,不是这样。
有什么让我满意的,还是我应该成为更好的数据库测试框架的下一个框架开发人员?
如果您认为可以使事情变得更好,则可以为现有解决方案做出贡献。如果那是不可能的,并且您认为可以创建杀手级数据库测试框架,那么我该说些什么。但是请不要忘记,繁琐的操作很容易,使用您自己的解决方案提出解决方案的难度就较小。
问题内容: 我需要用同一行的一组列(从左到右)中的第一个非空条目填充一个单元格-类似于SQL中的coalesce()。 在以下示例表中 我想在A行的每个单元格中放置一个单元格函数,这样我将得到: 我知道我可以使用一系列IF函数来做到这一点,但是在我的实际工作表中,我有30列可供选择,因此,如果有一种更简单的方法,我将很高兴。 问题答案: 这是一个数组公式。输入公式后,按+ +使Excel将其评估为
声明函数以映射值并在存在值时使用它们是很方便的。 在您有几个强制对象和几个可选对象的情况下,我发现自己将其他对象包装为可选对象。也可以使用(mandatoryObject),这样我就可以在它们上使用相同的表达式,而不必全部倒写。 但是我不喜欢这个代码: 所以我把它包装起来: 但这是错误的,因为蔬菜(在这个例子中)实际上不是可选的。它们非常重要,我只是给每个人的印象是它们是可选的。 所以我的问题是:
问题内容: 在C#中,您可以将一个类标记为,以便只能从同一包中对其进行访问。Java有什么类似的东西吗? 问题答案: 您可以通过从类的声明中省略安全修饰符(公共,私有)来创建程序包专用类。
问题内容: 我喜欢整个WMI概念,并且可以在Linux(在某些脚本中)中真正使用它。Linux系统有类似的东西吗? 问题答案: 并不是的。您是否正在使用WMI获取系统参数,查询过程,更改配置或监视系统事件,等等? 内核通过和文件系统公开了许多信息和可调旋钮。没有查询语言,只有目录和文件的组织层次结构。其中一些文件是只读,读写或只写的。其中一些人有能力。 有些服务可能具有动态自定义客户查询和更新配置
问题内容: 是否有与Java或JVM语言的Python virtualenv类似的东西? 问题答案: 据我了解,virtualenv使您能够拥有单独的库安装路径,从而有效地分隔“虚拟” Python安装。 Java没有“系统范围内已安装”库(*)的概念:它总是在类路径中搜索要加载的库。由于可以为每个应用程序定义类路径(并且需要将其定义!),因此每个应用程序都可以选择要加载的库和版本。 如果您更深入
问题内容: Java中是否有内置方法来查找任何数据类型的大小?有什么方法可以找到尺寸? 问题答案: 否。标准Java SE类库中没有这种方法。 设计者的观点是Java不需要它,因为该语言使应用程序1无需知道需要为原始值,对象或具有给定数量的元素的数组保留多少空间。 您可能会认为sizeof运算符对需要了解其数据结构占用多少空间的人很有用。但是,您还可以使用Java内存分析器简单,可靠地获得此信息以