问题标签 [dbunit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
13915 浏览

java - 如何使用 dbUnit 将数据库恢复到初始状态?

我是自动化测试和 dbUnit 的新手。所以我很感激你的建议。

我将创建一个测试套件,它将按以下方式运行:

  • 创建内存 H2 数据库
  • 运行 DDL 脚本来创建表
  • 运行 dbUnit 以插入将被所有测试使用的初始数据(我们称之为STATE0 )。
  • 运行测试

直到那里对我来说看起来不错,但我不明白的是,如何在测试运行后将数据库恢复到STATE0并更改数据?

我可以用 dbUnit 做吗?
还是用别的东西?
我应该在每次测试之前重新创建数据库吗?

简单的不在测试中提交事务对我来说是不合适的,因为测试最终会运行不止一个事务,可能不止一个数据库连接。

0 投票
2 回答
2415 浏览

java - 如何让 dbUnit 或 hibernate 停止从我的日期中减去一个小时?

所以,我有一个 XML 文件,我使用 dbUnit 作为数据源,其中有一些日期。文件中的日期是这样的:“2010-02-04”,但是一旦它被加载并且我访问它以在测试中打印或比较,它认为日期是“2010-02-03 23:00”。

我猜这与 EDT/EST 有关,但我不确定如何强制 dbUnit(或可能休眠?)使用正确的时区。

有人对 dbUnit 和日期有任何经验吗?

谢谢,彼得

编辑
好吧,我很确定,出于某种原因,它会将日期读取为 EDT,这是正确的,然后将其存储为 EST,这在技术上是不正确的(我们在这里是 EDT),但在我的计算机上是正确的说是EST。这种转换导致日期“丢失”一个小时。不知道为什么 Java 认为我们是 EST(Windows XP 知道我们不是),并且不确定为什么 dbUnit 认为日期应该是 EDT,因为它和 Java 一样,可能应该将不正确的时区读取为 EST。这很令人困惑。

编辑 我把 Hibernate XML 拿出来,因为那不是问题。经过更多的探索,这里发生了什么事: 1. dbUnit 从源 XML 读取日期作为字符串并将其转换为 java.sql.Date。从本质上讲,这些不存储小时/分钟/秒,但是当您查看毫秒时,它显然被调整了 4 小时,以表明虽然在 EDT 是午夜,但在 UTC 是凌晨 4 点。此外,这由日历支持,该日历的时区标记为“美国/纽约”或其他类似名称。我记不清了。2. 每当我打印这个日期时,我的系统,它认为它是美国东部标准时间,它会将世界标准时间凌晨 4 点重新转换为前一天晚上 11 点,这是正确的,除非我们不在美国东部标准时间。3. 每当我自己创建一个日期进行测试时,价值5小时的毫秒来区分它和 UTC。显然,这些是不同的“日期”,它失败了。

所以,我猜真正的问题是双重的: 1. 为什么我的控制台认为它是 EST?据我所知,我的 Windows XP 设置是正确的。我知道在 Java 1.4 中曾经有一个问题导致错误的 TZ,但我认为这已经修复并且我正在运行(据说)1.6。2. 为什么dbUnit,它是在同一个JVM中使用正确的花式TZ。

我想我可以停止一起使用日期,但我不一定有那种奢侈。

0 投票
8 回答
21117 浏览

unit-testing - JPA - 如何在单元测试之间截断表

我想在每个测试用例之后清理数据库而不回滚事务。我已经尝试过 DBUnit 的DatabaseOperation.DELETE_ALL,但是如果删除违反了外键约束,它就不起作用。我知道我可以禁用外键检查,但这也会禁用测试检查(我想阻止)。

我正在使用 JUnit 4、JPA 2.0 (Eclipselink) 和 Derby 的内存数据库。有任何想法吗?

谢谢,西奥

0 投票
6 回答
15221 浏览

java - DbUnit - 警告:AbstractTableMetaData

我在最新版本 2.4.8 中使用 DbUnit,并且在单元测试中收到许多警告,并显示以下消息:

所以我想我添加这个(我使用 MySQL 数据库):

但这无助于避免这些警告。这里有什么问题?

提前谢谢你和最好的问候蒂姆。

0 投票
1 回答
1298 浏览

java - 按主键集导出 DBUnit 数据集

我尝试使用一组初级键从 oracle 数据库中导出数据集:

这给了我一个 45mb 的数据文件!!!,检查文件我意识到问题是对具有复合键(6 个外键)的表的引用,而不是导出唯一引用的注册表,它采用了整个表数据。¿ 我认为这是 DBUnit 的一个错误,有人知道这种方法的解决方案吗?

0 投票
14 回答
27938 浏览

java - 有没有不适合 java/scala 的类似 dbunit 的框架?

我正在考虑制作一个新的、轻量级的数据库填充框架。我绝对讨厌 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 做过这个?每个人都有。不应该是这样的!

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

有什么可以让我满意,还是我应该成为更好的数据库测试框架的下一个框架开发人员?

0 投票
4 回答
226 浏览

java - 什么可以让这个 dsl 更容易输入或阅读?

我编写了一个有效的语法来替换 scala 中的 dbunit,称为 ScalaDBTest。整个程序有效 - 只花了 2 天的时间来编写。我有很多抛光工作要做。

无论如何,我用于 DSL 将数据输入数据库的语法是可延展的,我想要一些反馈。

基本语法如下所示。这很简单:

这肯定比 XML 或 SQL 插入语句好。

我辩论过使用“:”或“=”。前者看起来更好,但后者对我来说似乎是自动输入的。

还有一个概念,您可以在其中“标记”记录。从某种意义上说,上述语法是匿名记录。标签将是一个有趣的功能,因为您可以通过多种方式使用它们。

我不喜欢这种语法。有点啰嗦两句。使用“-”看起来不对,但如果我使用像“记录”这样的实际命令词,我需要用“->”将它们分开,否则看起来很糟糕(出于技术原因,这不是必需的)。

$label 将简单地重复标签,因此您可以最少使用标签作为重用字符串的方式。$label.uncamel 会在看起来像驼峰格的地方添加空格。

标签背后的想法是为 API 提供一种无需记住 id 即可访问记录的方法。如果您知道要获取的国家对象是“加拿大”,那么您只需传递标签“加拿大”,它就会将其转换为唯一的 id 并将其从数据库中提取出来。

这是一个可以指定默认参数的示例:

这是你看到的一些真正的力量。所有这 3 条“省”记录将有 4 列。由于有 2 个省份来自加拿大,因此它们自动继承自默认值。在第 3 种情况下,我们用 United States for New York 覆盖它。我们可以根据需要混合/匹配。

在实践中,这将节省大量的打字和认知负担,因为我们在实践中通常只关心几个值,其余的可能只是占位符,让数据库因缺少必填字段等而关闭。这也确实有助于测试多态对象。

这是另一个:

此代码段显示您实际上可以放置空值,而无需像在 dbUnit 中那样做任何技巧。在 DbUnit 中,您必须首先创建一个将自定义字符串(如“[NULL]”)转换为实际空值的转换器。

事实上,我们可以更具表现力,并提供各种表达式和函数来帮助生成数据。例如,$now 返回格式正确的今天日期/时间的 sql 日期。我将扩展这些功能以帮助更轻松地编写测试数据。

无论如何,我正在寻求帮助来真正清理语法。我可以做出任何改变,因为这是新鲜的,我想从一开始就让它变得非常时髦,而不是以后再改变。

谢谢

0 投票
1 回答
1470 浏览

dataset - 在 DBUnit 中为每个测试方法加载不同的数据集

我正在尝试使用 DBUnit 来测试我的 DAO 层方法。每种方法都需要不同的种子数据集。

例子:

getEmployeeById(Long id) 需要 Employee 表中的数据

updateOrder(CustomerId cId) 需要 Orders 表中的数据

有没有一种优雅的方法可以在运行不同的方法之前加载不同的种子数据,而不是在 setUp 方法中一次加载所有数据?

谢谢你。

0 投票
2 回答
5232 浏览

junit - 在表上打开 IDENTITY_INSERT 以使用 DB Unit 加载它

我尝试使用数据库单元加载具有标识列的表。我希望能够自己设置 id 值(我不希望数据库为我生成它)。

这是我的表的最小定义

要在 X 中插入一行,我执行以下 SQL

没问题。但是当我尝试使用以下数据库单元 XML 数据集 (RS_7_10_minimal_ini.xml) 加载此表时

使用以下最小 JUnit (DBTestCase) 测试用例:

它失败并出现以下异常

在插入指定了标识列的值的行之前,数据库单元似乎没有打开标识。

我已经尝试在从 JdbcDataBaseTester 检索到的连接上执行自己,但没有运气。可能是用于将数据推送到数据库的新连接或不同的连接。

任何想法?

非常感谢大家的帮助!

八度

0 投票
1 回答
5110 浏览

java - 将 DbUnit 与 Spring TestContext 一起使用的问题


我正在尝试单独测试我的 DAO 层(基于 JPA 构建)。在单元测试中,我使用 DbUnit 填充数据库并使用 Spring Test 来获取 ApplicationContext 的实例。

当我尝试使用 SpringJunit4ClassRuner 时,ApplicationContext 被注入,但 DbUnit 的 getDataSet() 方法从未被调用。

然后我尝试删除 @RunWith 注释,它消除了 getDataSet() 方法的问题。但现在我不再注入 ApplicationContext 实例。我尝试使用 @TestExecutionListeners 注释,它应该默认配置 DependencyInjectionTestExecutionListener,但 AppContext 仍然没有被注入。

有没有人有任何想法?结合这两个框架通常是一个坏主意吗?


编辑:这是测试类的其余源代码: