是否有一个类似dbunit的框架不';对于java/scala来说,它不是很烂吗?
我在考虑创建一个新的、轻量级的数据库总体框架。我绝对讨厌这个单位。在我做之前,我想知道是否有人已经做了 我不喜欢dbunit的东西: 1) 不推荐使用最简单的编写和启动格式。他们希望您使用臃肿的格式。有些甚至需要xml模式。是的,随便了 2) 它们不是按照您写入行的顺序填充行,而是按照xml文件中定义的顺序填充表。这是非常糟糕的,因为您不能以外键约束不会导致问题的方式对数据进行排序。这只会迫使你经历完全关闭它们的麻烦 这也会浪费时间,并且会使junit基类膨胀,从而包含禁用外键约束的代码。您可能需要测试数据库类型(hsqldb等),并以特定于数据库的方式禁用它们。这太糟糕了 如果dbunit帮助自动禁用外键约束作为其框架的一部分,可能会更好,但他们不会这样做。他们确实在追踪方言。。。那么为什么不使用它们呢?最终,所有这些都会迫使程序员浪费时间,而不是快速地开始测试 3) 编写XML是一件痛苦的事情。我不需要再多说了。他们也提供了很多方法,我认为这会使事情复杂化。只要提供一个真正可靠的方法,并完成它 4) 当您的数据变大时,跟踪ID及其一致/正确的关系是一件非常痛苦的事情 另外,如果你有一个月没有做一个项目,你怎么记得用户_id 1是管理员,用户_id 2是商业用户,用户_id 3是工程师,用户_id 4是其他什么?回去检查这件事是在浪费更多的时间。应该有一个有意义的方法来检索它,而不是一个任意的数字 5) 很慢。我发现,除非使用hsqldb,否则它的速度非常慢。不一定是这样。还有很多方法可以搞乱它的配置,因为“开箱即用”并不容易。要使它正常工作,你必须经历一个困难。所有这一切都是鼓励人们不要使用它,或者当他们开始使用它时感到愤怒 6) 有些值经常重复,比如日期。最好指定默认值,甚至让框架自动输入默认值,即使您没有告诉它将默认值输入其中。这样,您就可以仅使用所需的值创建对象,而不使用其他值。如果不需要的话,这肯定比指定列的每个角落要好得多 7) 可能最烦人的事情是第一个条目必须包含所有的值——即使是空占位符——否则未来的行将不会选择您实际指定的列 DBunit也没有将[NULL]转换为实际NULL值的合理默认值。您必须手动添加它。告诉我,谁没对dbunit做过这件事?每个人都有。不应该是这样的 这意味着,如果您有一个多态对象,则必须声明第一行中每个子类的连接表的所有外键,即使它们为null。如果您为所有子类模式创建一个表,那么仍然必须指定第一行上的所有字段。这太糟糕了是否有一个类似dbunit的框架不';对于java/scala来说,它不是很烂吗?,java,database,testing,scala,dbunit,Java,Database,Testing,Scala,Dbunit,我在考虑创建一个新的、轻量级的数据库总体框架。我绝对讨厌这个单位。在我做之前,我想知道是否有人已经做了 我不喜欢dbunit的东西: 1) 不推荐使用最简单的编写和启动格式。他们希望您使用臃肿的格式。有些甚至需要xml模式。是的,随便了 2) 它们不是按照您写入行的顺序填充行,而是按照xml文件中定义的顺序填充表。这是非常糟糕的,因为您不能以外键约束不会导致问题的方式对数据进行排序。这只会迫使你经历完全关闭它们的麻烦 这也会浪费时间,并且会使junit基类膨胀,从而包含禁用外键约束的代码。您可能
有什么可以让我满意的吗,或者我应该成为下一个更好的数据库测试框架的框架开发人员吗?这里列出了一些我特别喜欢或感兴趣的工具(除了DBunit)。至少他们可以提供一些灵感:
请注意,就范围或功能集而言,这些都不是DBunit的真正竞争对手。然而,有一些有趣的想法可能值得一看。祝你好运 我不知道DbUnit有什么真正的替代品,我也不知道所提到的任何工具:
- :不可知
- :用于测试数据库存储过程的回归和单元测试工具(这不是DbUnit的目的)
- :用于容器内测试的工具(我看不出它对数据库有何帮助)
- :数据库迁移工具(不加载/验证数据)
- :可以初始化数据库,但仅此而已
- :根本不与DbUnit竞争
allStudents = table(Student, ['id', 'name', 'grade']) {
row 1, 'Joe', Grade.A
rowOfInterest = row 2, 'John', Grade.B
}
@RunWith(JUnitPlatform.class)
@ExtendWith(DBUnitExtension.class)
@DBUnit(cacheConnection = true, cacheTableNames = true)
class TestInstrumentQueryService {
private ConnectionHolder connHolder = () -> EntityManagerProvider.instance("my-jta-unit").connection();
@DBRider
@DataSet("datasets/instrumentIds.yml")
void testFindInstrumentById() {
InstrumentQueryService iqs = new InstrumentQueryService(EntityManagerProvider.em());
Instrument instr = iqs.findInstrumentById(InstrumentIdType.TICKER_BBG, "AAPL");
assertEquals(100, instr.getId());
}
}