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

时间:2014-09-25 17:00:22

标签: grails geb

我已经在Grails上用Geb弄湿了脚,但是没有很多关于它如何表现的文档。例如,geb如何处理回滚?从我观察到的内容来看,它运行应用程序并在浏览器上运行测试,而不会在测试之间将其关闭。

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

1 个答案:

答案 0 :(得分:7)

Geb测试和功能测试通常与单元测试和集成测试完全不同。单元和集成测试在同一个JVM中运行,测试运行器在每次测试之前启动一个事务,并在测试运行后将其回滚,这样可以重置数据库,但实际上它只是保持测试不变数据库。但是,在测试开始之前插入到数据库中的任何数据(例如从BootStrap开始)都将用于每个测试。

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

Geb当然可以远程进行这些更改,但这需要修改您的应用程序以添加控制器或其他远程调用方式,但它不会。

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