【发布时间】:2011-09-12 19:35:13
【问题描述】:
在 Java 项目中,JUnit 测试执行设置、测试和拆卸。即使在使用内存数据库模拟真实数据库时,您通常也会回滚事务或从内存中删除数据库并在每次测试之间重新创建它。这为您提供了测试隔离,因为一个测试不会在可能影响下一个测试的环境中留下工件。每个测试都以一个已知状态开始,并且不能渗透到另一个测试中。
现在我有一个创建 1100 个表和 400K 代码的 Oracle db 构建 - 很多 pl/sql 包。我不仅想测试数据库安装(完全 - 从头开始创建,部分 - 从以前的数据库升级等)并确保所有表和其他对象在安装后处于我期望的状态,但也在 pl/sql 上运行测试(我不确定我将如何准确地执行前者 - 建议?)。
我希望这一切都在 Jenkins 中为 CI 运行,以便通过回归测试捕获开发错误。
首先,我必须使用企业版而不是 XE,因为 XE 不支持 java SP 并且依赖于 Oracle Web Flow。即使我消除了这些依赖项,构建通常也需要 1.5 小时才能加载(完整构建)。
那么您如何在这种环境中实现测试隔离?为每个测试使用事务并将它们回滚?好的,那些有提交的 pl/sql 过程呢?
我考虑过备份和恢复以在每次测试后重置数据库,或者在每次测试之间重新创建整个数据库(太激烈了)。两者都不实用,因为安装它需要一个多小时。对每个测试都这样做是矫枉过正和疯狂的。
有没有办法在数据库模式的沙子上画一条线,然后及时回滚到那个时间点?有点像一个大的“撤消”功能。除了 expdp/impdp 或 rman 之外的东西。也许整个方法都关闭了。建议?其他人是怎么做到的?
对于 CI 或小型生产升级窗口,整个测试套件必须在合理的时间内运行(最好是 30 分钟)。
是否有产品可以帮助实现这种“撤消”功能?
【问题讨论】:
-
您可以捕捉 db 的克隆(比 exp/imp 或 rman 快得多),然后在克隆上运行测试。 (询问您的系统管理员)
标签: oracle unit-testing testing plsql isolation