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

bat*_*ser 3 grails geb

我一直在Grails上用Geb弄湿了,但是没有很多关于它如何表现的文档.例如,geb如何处理回滚?根据我的观察,它运行应用程序并在浏览器上运行测试,而不会在测试之间关闭它.

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

Bur*_*ith 7

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

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

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

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