当前位置: 首页 > 知识库问答 >
问题:

GEB+Spock测试不能重用内容代码,因MissingMethodException而失败

常嘉平
2023-03-14

我最近才开始为我们的web应用程序创建Geb/Spock测试,并且--考虑到我对Geb、Spock和所有Groovy的知识有限--遇到了一个毫无意义的错误(考虑到我的Java经验)。

因此,下面是有问题的模块:

import geb.Module
import geb.navigator.Navigator

class Tile extends Module {

    def currencyPair

    static content = {

        amount { 
            $(".currencypair-span", text: containsWord(currencyPair))
                .parent().parent()
                .find(".tile-amount-setup").find("input") }     
    }       
 }

那里没什么特别的。

以下是这一页(不过,我不确定这是如何结合在一起的):

import geb.Page

class TraderApp extends Page {

    static url = "./"

    static at = { title == "FOOBARTrader" }

    static content = {
        tile { instrument -> module Tile, currencyPair: instrument }
    }

}
import geb.spock.GebSpec

import spock.lang.*
import org.openqa.selenium.Keys

class BugSpec extends SbkSpec {

    final CURPAIR = "FOOBAR"

    def setupSpec() {
        accountSelector.dropDown.click()

        accountSelector.dropDown << Keys.chord(Keys.CONTROL, "a")
        accountSelector.dropDown << "FxOnly"
        accountSelector.dropDown << Keys.ENTER

        waitFor() { accountSelector.dropDown.value() == "FXOnly" }

        tileLayout("Majors").tab.click()
    }

    def "test1"() {
        given:
            tile(CURPAIR).amount.click()

        when: 
            println("foo")

        then:
            waitFor {true}            
    }

    def "test2"() {
        given:
            tile(CURPAIR).amount.click()

        when: println("bar")

        then:
            waitFor {true} 
    }
}
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running BugSpec
Starting ChromeDriver (v2.10.267521) on port 32075
Only local connections are allowed.
foo
Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 19.425 sec <<< FAILURE!
test2(BugSpec)  Time elapsed: 0.175 sec  <<< ERROR!
groovy.lang.MissingMethodException: No signature of method: geb.navigator.NonEmptyNavigator.tile() is applicable for argument types: (java.lang.String) values: [FOOBAR]
Possible solutions: size(), tail(), filter(java.lang.String), find(java.lang.String), is(java.lang.String), take(int)
        at geb.navigator.NonEmptyNavigator.methodMissing(NonEmptyNavigator.groovy:463)
        at geb.content.NavigableSupport.methodMissing(NavigableSupport.groovy:123)
        at geb.Browser.methodMissing(Browser.groovy:194)
        at geb.spock.GebSpec.methodMissing(GebSpec.groovy:51)
        at BugSpec.test2(BugSpec.groovy:35)

根据Erdi的回答,BugSpec的超类也包括在内:

import geb.spock.GebReportingSpec

class SbkSpec extends GebReportingSpec {

    def setupSpec() {
        def environment = System.getProperty("geb.env");

        given:
            to AuthApp                

        expect:
            at AuthApp                

        when:
            def username = browser.getConfig().getRawConfig().get("username")
            def password = browser.getConfig().getRawConfig().get("password")

            login.username.value(username)
            login.password.value(password)

            login.loginButton.click()

        then:
            at TraderApp
            and:
                waitFor() { accountSelector.dropDown.value() == "FOOBAR-ACCOUNT" }
    }

    def cleanupSpec() {
        given:
            at TraderApp
        then:
            logout.logoutButton.click()
    }        
}

共有1个答案

华展鹏
2023-03-14

当使用内置基gebspec/gebreportingspec时,Geb将丢失的方法调用分派到spec的browser属性的page属性。有些东西(如果没有看到更多代码,就不可能说出它到底是什么)在第一次测试之前将该属性设置为TraderApp的实例。Geb在每个测试之间重新创建browser实例,这意味着页面实例被重置为默认值,即page的实例。如果将页面设置为TraderApp的实例,则将找到tile()方法

def "test2"() {
    given:
        page TraderApp
        tile(CURPAIR).amount.click()

    when: println("bar")

    then:
        waitFor {true} 
}

如果为bugspec的所有超类链提供代码,直到扩展gebspec/gebreportingspec的超类,那么就更容易推理并提供帮助。在我看来,您可能正在处理一种气味,在测试的设置方式中,它们的执行顺序很重要。

 类似资料:
  • 我正在尝试使用Spock运行geb测试。我已经在groovy脚本中编写了所有内容,该脚本位于中,如下所示

  • 我受到了某种测试污染。当我单独运行失败测试时,它们会通过。当我把它们一起运行时,我会得到错误。这些错误与数据库无关。我不能理解错误。例如:页面: 我不明白,因为模块的内容不是必需的。另外,另一个测试的污染会导致这种情况吗?我的测试太多了,无法列出。 我唯一的想法是cookie被设置而不是由我的程序。有一堆cookie,它们具有奇怪的名称,如“ba743b”、“kvcd”、“kn_ai”等,并具有神

  • 全面披露:我对Geb和Spock都很陌生。

  • 注意:如果我不使用JMockit,我可以进行调试,但是在生产代码中测试方法需要使用这个方法。 关于如何让调试器从使用JMockit的Spock测试中停在Java代码中,有什么想法吗?

  • 我正在使用Code::Blocks 12.11(使用MinGW),当我想在设置程序参数后启动调试会话时,GDB调试器在一开始就停止执行,整个程序就会冻结。这让我大吃一惊,因为我无法调试需要命令行参数的程序。这是“调试器”窗口中的最后两行(在此之后,什么都没有发生,代码::块冻结): 有谁知道为什么GDB不使用命令行参数的原因?

  • 所以我的问题是,功能测试通过“测试-应用程序集成”和“测试-应用程序”运行到底有什么不同? 与我所想的唯一不同的是,“test-app”运行所有测试阶段(单元、集成、功能)。 奇怪的是,它确实以某种方式工作,但只有当我首先运行“test-app-integration”时:/ null Tobbe致意