如何在Geb grails中设置和拆除功能测试数据

时间:2013-06-17 13:51:41

标签: grails functional-programming spock geb test-data

我有很多工作/传递函数geb / spock测试(每个扩展GebReportingSpec),它们测试一个Web应用程序,测试数据都是在功能测试套件开头的BootStrap.groovy中创建的。

我想将测试数据创建移动到每个Spec中的startup()/ teardown()方法中,实际上我想让它们从基类继承它,但显然StepWise存在继承问题。

所以,目前我的每个测试规范类看起来都像:

@Stepwise
class ExampleSpec extends GebReportingSpec {

    def "valid root user logs in"() {

        given: "I am at the login page"
        to LoginPage

        when: "I enter root's credentials"
        username = "root"
        password = "password"

        and: "I click the login button"
        loginButton.click()

        then: "I am logged in and directed to the welcome page"
        at WelcomePage
    }
}

现在,我的问题是我似乎无法创建可以创建测试数据的新测试(在第一个测试之上)。没有有效的给定/ when / then语句,测试似乎没有执行,并且从现有测​​试中调用方法似乎也不起作用。我已经查看了grails-remote-control插件来帮助我,我相信这将允许我成功地调用闭包来设置数据,但我不确定从GebReportSpecs(或一些抽象父类)中调用它的最佳机制

以下是我希望能够做的事情的简要概述,或者通过将'setupData()'作为第一个测试,或者通过在测试中调用该方法......两者似乎都不起作用。< / p>

def remote = new RemoteControl()
def setupData() {

    def id = remote {        
        def ShiroUser user = new ShiroUser(username: "root", ...)
        user.save()
        user.id
   }
   println(id)
}

.... Tests then follow

是否有像@before等注释可以强制调用这些方法?

任何建议都表示赞赏。

解决方案: 我已经在正确的答案中接受了下面的dmahapatro的回复,但也提供了一个我最终解决方案的例子给那些可能觉得有用的人。

2 个答案:

答案 0 :(得分:3)

未测试
GebReportingSpec扩展GebSpec,最终扩展spock.lang.Specification Fixture Methods

您可以使用它们:

@Stepwise
class ExampleSpec extends GebReportingSpec {
    def setupSpec(){
       super.setupSpec()
       //setup your data
    }

    def cleanupSpec(){
       super.cleanupSpec()
       //I do not think you would need anything else here
    }

    def "This is test 1"(){

    }

    def "This is test 2"(){

    }
}

您不能将setup用作测试方法之一,因为不会为单个测试用例维护状态。它是这样的: -

setup called -> test1 -> teardown called  
setup called -> test2 -> teardown called  
setup called -> test3 -> teardown called  
.........

答案 1 :(得分:1)


##解决了##

感谢 dmahapatro (以及 erdi )。我特意掩盖了setupSpec()和cleanup(),因为它们在GebReportingSpec中是私有的。

为了完成起见,我将使用grails remote control plugin发布我的最终解决方案的简化版本,以防万一它可以帮助其他任何人。唯一需要注意的是,设置/拆卸似乎每个Spec调用一次,而不是在每次测试之前调用。对我来说实际上最好是因为我的测试数据非常复杂并且需要时间来创建。因此,您有一组来自Spec的测试数据,这些测试数据通过Spec中的测试进行修改,然后在下一个Spec执行之前最终清除。

@Stepwise
class TestDataBaseSpec extends GebReportingSpec {

    protected void createTestUsers() {

        def remote = new RemoteControl()
        def created = remote {

        def createUser = { name, roles, pwHash ->
            def user = new ShiroUser(username: name, passwordHash: pwHash, passwordSetDate: new Date())
            roles.each { user.addToRoles(it) }
            user.save(failOnError: true)
            return user
        }

        createUser("root", [ShiroRole.findByName("base_user")], pwHash)
        // .. repeat for more
        }
    }

    protected void deleteTestUsers() {

        def remote = new RemoteControl()
        def created = remote {
            ShiroUser.findAll().each {
                it.delete(flush: true)
            }
            return true
        }
    }
}

@Stepwise
class ExampleSpec extends TestDataBaseSpec {

    def setupSpec() {
        super.createTestUsers()
    }

    def cleanupSpec() {
        super.deleteTestUsers()
    }

    def "valid root user logs in"() {

        given: "I am at the login page"
        to LoginPage

        when: "I enter root's credentials"
        username = "root"
        password = "password"

        and: "I click the login button"
        loginButton.click()

        then: "I am logged in and directed to the welcome page"
        at WelcomePage
    }
}