【发布时间】:2014-09-22 18:56:15
【问题描述】:
我有一个在 JBoss 7 上运行的 Java EE 应用程序。为了进行 TDD,我正在设置使用 Arquillian 与嵌入式 Weld 和 H2 嵌入式数据库的嵌入式测试。
这很好用,但是 Hibernate 的初始启动需要相当长的时间(5-10 秒),而且我还没有包含所有 JPA 实体。我尝试使用持久化的 Oracle DB 来避免创建表,但这并没有太大的区别。
主要问题似乎是 Hibernate 遍历所有实体并验证和准备所有 CRUD 方法、命名查询等。
有没有办法告诉 Hibernate 在需要时(或根本不这样做)懒惰地执行此操作?大多数情况下,测试用例中只涉及实体和查询的子集,所以我很乐意在实施时用执行时间换取启动时间。
有什么想法吗?
我知道我可以只使用实体的一个子集,但有时会很困难,因为它们通常与测试上下文中不需要的其他实体有关系。或者是否有一种简单的方法可以“停用”此类关系以生成数据库的子集?
澄清
似乎不清楚我的问题是什么,所以我会尝试澄清:
- 我已经使用 Arquillian(嵌入式 Weld)设置了一个测试环境,该环境设置了一个嵌入式数据库 (H2) 来执行启用 JPA 的测试
- 我想使用这种方法进行测试驱动开发 (TDD),这意味着我将在我的本地开发机器上拥有以下工作流程:
- 创建测试用例
- 运行测试用例
- 如果测试用例失败,实施必要的更改并返回 2。
- 通常,在完成一项功能之前,我会执行几次步骤 2 和 3,这意味着我通常会从我的 IDE 运行单个测试,该测试必须使用 Arquillian、Weld、嵌入式 DB 和只需运行一次测试即可。
场景就这么多了。现在我注意到运行该单个测试大约需要 10 秒,这不是世界末日,而是做 TDD 的时间。当我进一步调查时,我注意到大部分时间都用于 Hibernate 设置其内部结构(不是 Weld、Arquillian、Schema 创建或其他什么,而是 Hibernate 准备提供 EntityManager)。
所以我的问题是:有没有办法加快休眠初始化,以便我可以将这 10 秒缩短到 1-2 秒?我不在乎这是否是一种 hack(比如在多次手动测试运行期间保持测试 JVM 与休眠状态或停用休眠的某些验证或优化)。我唯一的问题是单个测试的启动时间。连续的测试运行良好且快速,所以我对完整的回归测试或在我的构建服务器上进行测试没有问题。
希望这能让我的情况更清楚...
【问题讨论】:
标签: java hibernate jpa tdd embedded-database