2

Gradle テスト タスクのシステム プロパティを動的に構成することは可能ですか? 私はそれを機能させる方法を見つけていません。

私は自分のGradleプラグイン内で作業していますGwtPlugin. メソッドは次のapply()ようになります。

/** Apply the plugin. */
void apply(Project project) {
   project.plugins.apply(JavaPlugin)
   project.plugins.apply(WarPlugin)

   project.extensions.create("gwt", GwtPluginExtension, project)
   project.extensions.create("testSuite", TestSuitePluginExtension, project)
   project.convention.plugins.gwt = new GwtPluginConvention(project)

   applyGwt(project)
   applyTestSuite(project)
}

このapplyTestSuite()メソッドでは、テスト スイートのタスクを作成します。タスクの定義はintegrationtest次のようになります。

// Run integration tests, assumed to be found in a class suites/IntegrationTestSuite.
project.task("integrationtest", type: org.gradle.api.tasks.testing.Test, dependsOn: project.tasks.buildApplication) {
    workingDir = { project.testSuite.getWorkingDir() == null ? project.projectDir : project.testSuite.getWorkingDir() }
    scanForTestClasses = false
    scanForTestClasses = false
    enableAssertions = false
    outputs.upToDateWhen { false }

    include "suites/IntegrationTestSuite.class"
    systemProperty "integration.test.server.wait", project.gwt.getServerWait()

    beforeSuite { descriptor ->
       if (descriptor.className == "suites.IntegrationTestSuite") {
          project.convention.plugins.gwt.rebootDevmode()
       }
    }

    afterSuite { descriptor ->
       if (descriptor.className == "suites.IntegrationTestSuite") {
          project.convention.plugins.gwt.killDevmode()
       }
    }
}

integration.test.server.waitからシステム プロパティの構成を取得したいと考えていますproject.gwt.getServerWait()。これを機能させる方法がわかりません。不可能だと思い始めています。

システム プロパティをハードコーディングすると、すべてが期待どおりに機能します。

systemProperty "integration.test.server.wait", 10

問題は、タスクの定義時にシステム プロパティが設定されているようですが、その時点で拡張機能に値がありません。これを回避する方法がわかりません。

たとえば、project.gwt.getServerWait()呼び出しをクロージャーに入れようとしましたが、その場合、システム プロパティは次のような文字列に設定されます。

com.me.gradle.GwtPlugin$_applyTestSuite_closure10_closure42@320de756

systemPropertyまた、行をdoFirstブロックに移動してみました。その場合、doFirstブロックは私の拡張機能から適切な値を取得します (出力できます) が、割り当てが遅すぎてテスト ランナーに影響を与えないようです。

これを達成する方法はありますか?そうでない場合、動的構成をテスト ランナーに渡す別の方法はありますか?

4

4 に答える 4

2

私はこれを機能させる方法を見つけました。トリックは、プロパティが確実に使用可能になった後でテスト タスクにシステム プロパティを設定することです。これを実現する最も簡単な方法は、ダミーの依存関係を使用することです。

project.task("integrationtestconfig") << {
   outputs.upToDateWhen { false }
   project.tasks.integrationtest.systemProperty("integration.test.server.wait", project.gwt.getServerWait())
}

project.task("integrationtest", type: org.gradle.api.tasks.testing.Test, 
             dependsOn: project.tasks.buildApplication, project.tasks.integrationtestconfig)
...

これは私が望んでいたエレガントなソリューションではありませんが、機能し、従うのはそれほど難しくありません。

于 2013-10-23T01:01:45.603 に答える
1

私がすることは:

ext {
    // Sets a sensible default
    myProperty project.properties.myProperty
}
task preTest << {
    // Computes the property...
    project.ext.myProperty = ...
}
task myTest {
    ...
    doFirst {
        systemProperty 'myProperty', project.ext.myProperty
    }
}

gradle.propertiesファイルに適切なデフォルト値を定義します。

myProperty = A sensible default value

マルチモジュール環境では、よりトリッキーになる可能性があります。次にrootProject.ext.myPropertytestタスクから使用します。

よろしく、ダミアン。

于 2016-04-05T17:07:27.373 に答える
0

これが機能するかどうかはわかりませんが、この方法でやろうとしましたか

doLast {
    systemProperty "integration.test.server.wait", project.gwt.getServerWait()
}

プラグインスクリプト内?

これは、物事がgradleで解決されるフェーズ(構成、...)に関係している可能性があります。

于 2013-10-23T11:41:28.950 に答える