grails - 每次测试后,geb 是否会将数据库回滚到其原始状态?

标签 grails geb

我已经在 Grails 上尝试使用 Geb,但是没有很多关于它的行为的文档。例如,geb 如何处理回滚?据我观察,它运行应用程序并在浏览器本身上运行测试,而无需在测试之间将其关闭。

当一个规范(规范 A)改变一个对象(对象 Z),并且在一些测试之后,另一个规范(规范 B)改变同一个对象时,数据库数据会发生什么?每次运行规范时,geb 是否会将数据库回滚到其原始状态?我试图确认,因为我的geb测试在单独执行时运行良好,但是当我将它们作为套件运行时,其中一些测试失败了,我能想到的最好的原因是数据不处于原始状态当对其进行第二次测试时。有什么想法吗?

最佳答案

一般来说,Geb 测试和功能测试与单元测试和集成测试有很大不同。单元测试和集成测试在同一个 JVM 中运行,测试运行器在每个测试之前启动一个事务,并在测试运行后回滚它,这具有重置数据库的效果,但实际上它只是阻止测试更改数据库。但是在测试开始之前插入数据库的任何数据(例如来自 BootStrap)都将存在于每个测试中。

但功能测试通常在一个 JVM 中运行,但它们会对在第二个 JVM 中运行的应用程序进行远程调用。这限制了您在测试期间可以执行的操作,例如您无法操作元类,或更改 Spring bean 实例变量,并且无法启动和回滚事务以隔离测试之间的数据更改。您可以执行这些操作中的任何操作,但它们只会影响本地 JVM。

Geb 当然可以远程进行这些更改,但这需要修改您的应用程序以添加 Controller 或进行远程调用的其他方式,但事实并非如此。

一般来说,测试不应该排序并且应该是独立的,但是我发现在进行功能测试时,打破该规则并对它们进行排序是有意义的,其中早期的测试进行一些插入或其他更改,而稍后的测试则进行一些插入或其他更改根据先前的更改进行进一步的工作和/或检查。我还添加了仅测试 Controller 操作,可用于回滚更改(通过事务或删除插入的数据、撤消更新和删除等)并进行其他更改以协助测试,但这必须是仔细完成以确保它仅在测试期间可用并且不会成为重大安全风险。

关于grails - 每次测试后,geb 是否会将数据库回滚到其原始状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26044158/

相关文章:

java - 用于测试的 ZK Framework 和 Geb

selenium - 如何使用 firefox 驱动程序运行 GEB 测试?

intellij-idea - 配置 IntelliJ 以运行 Groovy Cucumber Geb 框架

hibernate - 如何在不锁定所有表的情况下进行保存

grails - 如何使用 apache POI 逐行遍历 .docx 文件

spring - Grails电子邮件插件发送电子邮件失败

google-chrome - Chrome 60 启用 headless 模式登录

grails - 我无法使用 Geb 和 spock 运行简单的 Grails 功能测试

grails - 在 Grails 应用程序中使用 Spring 安全认证的 DotCMS

grails - 如何在已部署的 Grails 2.1.0 应用程序中包含 Groovy 2.0?