3

Sauce Labs Java REST APIを使用して、合格/不合格のステータスをSauceLabsダッシュボードに送り返したい。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の実行の最後に書かれたことがわかりました。現在の実行の値を取得する方法が必要です。

ありがとう!

4

2 に答える 2

2

テストレポートは、仕様の実行が終了した後に生成され、生成はビルドシステムによって実行されるため、この場合はGradleによって生成されます。Spockはそのことを認識していないため、テスト内からその情報を取得することはできません。

一方、Gradleからその情報を非常に簡単に取得できます。テストタスクには、 addTestListener()afterSuite()の2つのメソッドがあります。ここでのよりクリーンな解決策は、最初のメソッドを使用し、テストリスナーを実装し、ロジックをリスナーのafterSuite()に配置することです(タスク構成ではないようです)。SauceRESTに依存しているように見えるため、おそらくそのリスナー実装をbuildSrcに配置する必要があります。また、build.gradleのaddTestListener()の引数として使用する前に、リスナークラスをビルドしてコンパイルする必要があります。あなたのプロジェクト。

于 2012-12-07T23:54:13.533 に答える
2

erdiの提案に続いて、 Sauce Gradleヘルパーライブラリを作成しました。これは、テストXML出力を解析し、S​​auceRESTAPIを呼び出して合格/不合格ステータスを設定するテストリスナーを提供します。

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"))

また、SauceListenerがSauceジョブを合格/不合格ステータスに関連付けることができるように、各テストのSeleniumセッションIDを出力する必要があります。これを行うには、次の出力をstdoutに含めます。

SauceOnDemandSessionID=SELENIUM_SESSION_ID
于 2012-12-20T22:10:16.647 に答える