【问题标题】:Does geb rollback the database to its virgin state after every each test?每次测试后,geb 是否将数据库回滚到其原始状态?
【发布时间】:2014-09-25 17:00:21
【问题描述】:

Grails 上的 Geb 一直让我感到兴奋,但关于它的行为方式的文档并不多。例如,geb 如何处理回滚?据我观察,它运行应用程序并在浏览器本身上运行测试,而不会在测试之间关闭它。

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

【问题讨论】:

  • 这取决于您如何配置 build.gradle 文件!
  • 您可能想查看remote-control plugin。您可以在 @Stepwise 功能测试期间使用它来查询和操作数据库。例如,我用它来测试新帐户注册。该应用程序会向新用户发送一封验证电子邮件,其中包含用于激活帐户的 URL。我从数据库中检索该 URL 并在 Geb 测试中“验证”新帐户。

标签: grails geb


【解决方案1】:

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

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

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

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

【讨论】:

  • 我总是建议使用Grails Remote Control plugin(或Groovy Remote Control,当被测应用程序不是用 Grails 编写时)因为我认为最好让您的夹具代码尽可能接近测试,并且夹具控制器并不真正符合该描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2023-01-11
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多