web-dev-qa-db-ja.com

Gradleおよび-Dを使用してテストにシステムプロパティを与える方法

システムプロパティを読み取るJavaプログラムがあります

System.getProperty("cassandra.ip");

そして、私はGradleビルドファイルを持っています

gradle test -Pcassandra.ip=192.168.33.13

または

gradle test -Dcassandra.ip=192.168.33.13

ただし、System.getPropertyは常にnullを返します。

私が見つけた唯一の方法は、それをGradleビルドファイルに追加することでした

test {
    systemProperty "cassandra.ip", "192.168.33.13"
}

-D経由でそれを行う方法

75
robkuz

-Pフラグはgradleプロパティ用で、-DフラグはJVMプロパティ用です。テストは新しいJVMで分岐される可能性があるため、gradleに渡された-D引数はテストに伝播されません。これは、あなたが見ている動作のようです。

testブロックでsystemPropertyを使用することはできますが、-Pで渡すことにより、着信gradleプロパティに基づいて作成できます。

test {
    systemProperty "cassandra.ip", project.getProperty("cassandra.ip")
}

または、-Dで渡す場合

test {
    systemProperty "cassandra.ip", System.getProperty("cassandra.ip")
}
92
Jeff Storey

この非常に多くの問題に出くわしましたが、Gradleスクリプトのコマンドラインで指定されたすべてのプロパティを再度表示したくないことを除いて。したがって、すべてのシステムプロパティをテストに送信します

task integrationTest(type: Test) {
    useTestNG()
    options {
        systemProperties(System.getProperties())
    }
}
22
MrSpock

複数システムプロパティをテストJVMに渡す必要があるが、all(無関係なものを渡したくない)を渡す必要がある場合がありました。上記の回答に基づいて、subMapを使用して必要なものをフィルタリングすることで、これは私のために働いた:

task integrationTest(type: Test) {
    // ... Do stuff here ...
    systemProperties System.getProperties().subMap(['PROP1', 'PROP2'])
}

この例では、PROP1PROP2のみが、gradleのJVMに存在する場合に渡されます。

8
avivr

多数のプロジェクトプロパティをシステムプロパティとしてテストJVMに渡すバリアントは次のとおりです。柔軟性を高めるために、システムプロパティよりもプロジェクトプロパティの方が好きです。

task intTest(type: Test) {
    systemProperties project.properties.subMap(["foo", "bar"])
}

コマンドラインで渡すことができます:

 $ gradle intTest -Pfoo=1 -Pbar=2

そして、あなたのテストで取得しました:

String foo = System.getProperty("foo");
4
Eron Wright

だから今日もその問題に出くわしましたが、私にとってうまくいったのは次のとおりです:

ext.env='prod'
test {
  systemProperty 'env', System.properties['env'] ?: "${env}"
  println "# test environment: " + systemProperties['env']
  ...
}

-Penv = devを使用してテストタスクを呼び出しており、印刷で「dev」値を取得します。値を送信しない場合は「prod」を取得します。 。

値はJava側でも、System.getProperty( "env")を使用してアクセスできます。

この問題に関する私の結論は、入力値(パラメーター)は実際にはSystemの下に保存され、System.properties ['env']またはSystem.getProperty( "env")。出力(システムプロパティ)はsystemProperties配列に格納され、systemProperties ['env']で読み取り可能になります。

0
Olivier B.