groovy - 如何使用 Geb/Spock 向 Sauce Labs 报告结果?

标签 groovy automation spock geb saucelabs

我想使用 Sauce Labs Java REST API 将通过/失败状态发送回 Sauce Labs 仪表板。我正在使用 Geb+Spock,我的 Gradle 构建会创建一个测试结果目录,其中结果以 XML 格式输出。我的问题是,直到 Spock 规范的 cleanupSpec() 退出之后,结果 XML 文件似乎才生成。这导致我的代码报告上一次测试运行的结果,而不是当前的结果。显然不是我想要的!

是否有某种方法可以在不依赖 XML 的情况下从 cleanupSpec() 中获取结果?或者有什么方法可以让结果更早提交?或者有比其中任何一个更好的替代方案?

一些代码:

build.gradle中,我指定了testResultsDir。这是 Spock 规范退出后 XML 文件写入的位置:

drivers.each { driver ->
    task "${driver}Test"(type: Test) {
        cleanTest
        systemProperty "geb.env", driver    
        testResultsDir = file("$buildDir/test-results/${driver}")
        systemProperty "proj.test.resultsDir", testResultsDir
    }
}

这是我的 LoginSpec 类中的 setupSpec()cleanupSpec():

class LoginSpec extends GebSpec {
    @Shared def SauceREST client = new SauceREST("redactedName", "redactedKey")
    @Shared def sauceJobID
    @Shared def allSpecsPass = true

    def setupSpec() {
        sauceJobID = driver.getSessionId().toString()
    }

    def cleanupSpec() {
        def String specResultsDir = System.getProperty("proj.test.resultsDir") ?: "./build/test-results"
        def String specResultsFile = this.getClass().getName()
        def String specResultsXML = "${specResultsDir}/TEST-${specResultsFile}.xml"
        def testsuiteResults = new XmlSlurper().parse( new File( specResultsXML ))

        // read error and failure counts from the XML       
        def errors = testsuiteResults.@errors.text()?.toInteger()
        def failures = testsuiteResults.@failures.text()?.toInteger()

        if ( (errors + failures) > 0 ) { allSpecsPass = false }

        if ( allSpecsPass ) {
            client.jobPassed(sauceJobID)
        } else {
            client.jobFailed(sauceJobID)
        }
    }
}

此类的其余部分包含不与 SauceLabs 交互的登录规范。当我读取 XML 时,发现它是在上一次 LoginSpec 运行结束时写入的。我需要一种方法来获取当前运行的值。

谢谢!

最佳答案

测试报告是在规范完成执行后生成的,并且生成是由构建系统执行的,因此在您的情况下是由 Gradle 执行的。 Spock 对此一无所知,因此您无法从测试中获取该信息。

另一方面,您可以很轻松地从 Gradle 获取该信息。测试任务有两种您可能感兴趣的方法:addTestListener()afterSuite() 。看来这里更干净的解决方案是使用第一种方法,实现一个测试监听器并将您的逻辑放在 afterSuite() 中。监听器的(而不是任务配置)。您可能需要将该监听器实现放在 buildSrc 中因为看起来您依赖 SauceREST,并且您需要构建并编译您的监听器类,然后才能将其用作项目的 build.gradle 中的 addTestListener() 的参数。

关于groovy - 如何使用 Geb/Spock 向 Sauce Labs 报告结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13694215/

相关文章:

java - 在 spring java 配置中注册 groovy bean

groovy - 将更新的 XML 写入原始解析的文件

mysql - Grails - 无法使用 Mysql 执行 SELECT WHERE

groovy - 如何使 eclipse junit stacktrace 使用非比例字体?

groovy - 如何在groovy中将 boolean 值(真或假)转换为字符串值?

java - Selenium:当某些 xpath 没有元素时如何编写 if 条件

c# - 运行编码 UI 时如何解析当前目录

docker - 在Docker中使用Appium自动化iOS应用程序

java - Docker-Compose 版本不受支持

grails - Geb-Spock测试无法选择dd文本