当整体 运行 class 时,Spock 非初始特征方法失败

Spock non-initial feature methods fail when running class as a whole

我正在同时使用 Geb 和 Spock 来测试前端应用程序。我对这两种工具都不熟悉。我有一个扩展 GebReportingSpec 的 Spock 规范。

然后我有一个 setupSpec 登录到应用程序并导航到特定页面。接下来是在网页上执行操作的各种特征方法(例如单击下拉菜单然后 selecting 一个选项)。

所有的特征方法在它们自己运行时都成功通过。第一个功能方法只是 selects 下拉列表中的一个值,并断言显示正确的字段作为结果(selected 选项控制在页面上显示哪些字段)。第二个特征方法无法 select 来自下拉列表的不同选项,因此该方法的断言失败,因为它找不到字段。更新新字段的事件不会触发该选项 selected。我的规格如下:

    class VerifyFields extends GebReportingSpec {
        def setupSpec() {
          // Log in
          via Dashboard
          loginForm.login("marco", "abc123")

          // Navigate to Page 1
          button1.click()
          button2.click()

          // Click Button 3
          button3.click()
    }

// This feature method passes successfully
    def "Verify Member fields exist"() {
        when: "User selects Member option for drop down 1"
        at Page1
        projSubject.click()
        projCoverMbrFields.projSubjectMbrOption.click()
        sleep(1500)

        then: "All expected member fields are displayed in the left panel"
        assert mbrName.present
    }

// This feature method fails when run after the first feature method
    def "Verify Provider fields exist"() {
        when: "User selects Provider option for subject type"
        at Page1
        projSubject.click()
        projCoverProvFields.projSubjectProvOption.click()
        sleep(1500)

        then: "All expected provider fields are displayed in the left panel"
        assert provName.present
    }

我已经尝试添加一些东西来让页面专注于如下几行的元素:

driver.findElement(By.className("projSubject")).click()
driver.findElement(By.cssSelector(".projSubjectoption[value='Provider']")).click()

并使用以下行将属性更改为 selected="selected":

$("select.projSubject option[value='Provider']").jquery.attr("selected", true)
projCoverProvFields.projSubjectProvOption.jquery.attr('selected', 'selected')

但我无法解决第二个特征方法未能成功触发下拉selection 更新页面字段的问题。

您的错误可能是因为您 运行ning setupSpec() 是 运行 每个规范一次(而不是每个方法一次)。为了维护规范中所有方法的会话和 运行 它们,您需要在 class.

的顶部添加 @Stepwise spock 属性
@Stepwise
class VerifyFields extends GebReportingSpec {
   ...
}

另一种选择是使用 setup() 而不是 setupSpec(),区别如下:

def setup() {}          // run before every feature method
def setupSpec() {}     // run before the first feature method

通过使用 setupSpec(),它将 运行 在第一个特征方法之前,这就是两个测试可以单独工作的原因。尝试用 setup() 替换 setupSpec()。

请记住,运行ning setup() 会增加您的总测试执行时间,因为您将为每个方法重复。如果可能的话,我会使用@Stepwise。