如何重构常见的Geb测试序列

use*_*644 3 grails spock geb

假设我有登录的多个Geb/Spock测试.例如:

@Stepwise
Class AddNewPictureSpec extends GebSpec {
  def "User at login page"() {
    given: "User beings from login page"
    to LoginPage
  }
  def "User gets redirected to Main page"() {
    given: "User at Login page"
    at LoginPage

    when: "User signs in"
    signIn "username", "pw"
    to MainPage

    then:
    at MainPage

  def "other test sequences follow...."() {
  }    
}
Run Code Online (Sandbox Code Playgroud)

另一个测试规范具有完全相同的启动顺序:

@Stepwise
Class EditPictureSpec extends GebSpec {
      def "User at login page"() {
        given: "User beings from login page"
        to LoginPage
      }
      def "User gets redirected to Main page"() {
        given: "User at Login page"
        at LoginPage

        when: "User signs in"
        signIn "username", "pw"
        to MainPage

        then:
        at MainPage    

  def "other test sequences follow...."() {
      }
    }
Run Code Online (Sandbox Code Playgroud)

如何重构/提取常见的登录"步骤",以便我没有重复的代码?还是我错误地写了我的测试?谢谢.

rcg*_*e23 6

我认为'geb'方法是使用模块.

您可以创建如下的登录模块:

class LoginModule extends Module {  
    static content = {
        loginForm {$("form")}
        loginButton {$("input", value: "Sign in")}
    }

    void login(String username, String password = "Passw0rd!") {
        loginForm.j_username = username
        loginForm.j_password = password
        loginButton.click()
    }
}
Run Code Online (Sandbox Code Playgroud)

包括在你的LoginPage:

class LoginPage extends Page {
    static url = "login/auth"   

    static at = {title == "My Grails Application"}

    static content = {
        loginModule { module LoginModule }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在测试中,您可以引用模块的login方法:

@Stepwise
class EditPictureSpec extends GebSpec {

    def setupSpec() {
        to LoginPage
        loginModule.login(loginUsername)
    }

    def "some test"() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)