我想使用Sauce Labs Java REST API将Pass / Fail状态发送回Sauce Labs仪表板。我正在使用Geb + Spock,我的Gradle构建创建了一个测试结果目录,其中结果以XML格式输出。我的问题是结果XML文件似乎没有生成,直到之后 Spock规范的cleanupSpec()退出。这会导致我的代码报告上一次测试运行的结果,而不是当前的结果。显然不是我想要的!
有没有办法从cleanupSpec()中获取结果而不依赖于XML?或者是一种将结果提前归档的方法?或者某些替代方案会比其中任何一方好得多?
部分代码:
在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运行结束时编写的。我需要一种方法来获得当前运行的值。
谢谢!
答案 0 :(得分:2)
测试报告是在规范完成执行并且生成由构建系统执行后生成的,因此在您的情况下由Gradle执行。 Spock对此并不了解,因此您无法从测试中获取该信息。
另一方面,您可以轻松地从Gradle获取该信息。测试任务有两种方法可能会让您感兴趣:addTestListener()和afterSuite()。这里似乎更清晰的解决方案是使用第一种方法,实现测试监听器并将您的逻辑放在监听器的afterSuite()中(而不是任务配置)。您可能需要将该侦听器实现放在buildSrc中,因为看起来您对SauceREST有依赖性,并且您需要构建并编译您的侦听器类,然后才能将其用作addTestListener()的参数。你的项目的build.gradle。
答案 1 :(得分:2)
根据erdi的建议,我创建了一个Sauce Gradle helper库,它提供了一个Test Listener,用于解析测试XML输出并调用Sauce REST API来设置pass / fail状态。
可以通过将以下内容添加到build.gradle文件中来包含库:
import com.saucelabs.gradle.SauceListener
buildscript {
repositories {
mavenCentral()
maven {
url "https://repository-saucelabs.forge.cloudbees.com/release"
}
}
dependencies {
classpath group: 'com.saucelabs', name: 'saucerest', version: '1.0.2'
classpath group: 'com.saucelabs', name: 'sauce_java_common', version: '1.0.14'
classpath group: 'com.saucelabs.gradle', name: 'sauce-gradle-plugin', version: '0.0.1'
}
}
gradle.addListener(new SauceListener("YOUR_SAUCE_USERNAME", "YOUR_SAUCE_ACCESS_KEY"))
您还需要为每个测试输出Selenium会话ID,以便SauceListener可以将Sauce Job与通过/失败状态相关联。为此,请在标准输出中包含以下输出:
SauceOnDemandSessionID=SELENIUM_SESSION_ID