Gradleと-Dを介してシステムプロパティをテストに与える方法


103

Systemプロパティを読み取る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でそれを行う方法


1
使用するとどうなりますgradle -Dcassandra.ip=192.168.33.13か?とにかく、テストタスクは1つまたは複数の新しいJVMをフォークします。したがって、プロパティを明示的に渡す必要があります。ただし、ビルドでその値をハードコードするように強制する人はいません。
JBニゼット2014年

また、この答えで見てみましょう:stackoverflow.com/questions/23689054/...
IgalS

回答:


123

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

あなたがしたようにあなたのtestブロックでsystemPropertyを使うことができますが、それと一緒にそれを渡すことによって入ってくるgradleプロパティに基づいています-P:

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

または、-Dを介して渡す場合

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

1
これは私にとっては機能しません(System.getProperties().stringPropertyNames().forEach(System.out::println);Javaコードでテストし た結果、表示されません)
CLOVIS

警告:プロパティが見つからない場合にgetPropertyスローMissingPropertyExceptionされます。代わりにEronの回答を使用してください:stackoverflow.com/a/43112126/915441
Yngvar Kristiansen

1
デフォルト値を追加することはgradle.properties防ぐことができますMissingPropertyException
ダンカンカルバート

私はこれらの方法をどちらも機能させることができません。私が何をしてもmyPropertyは常にnullです。これには、以下で説明するすべてのメソッドも含まれます。すべてのコメントは2018年のものなので、これはより新しいバージョンと関係があるのでしょうか?@CLOVISこれに対する解決策を見つけましたか?
Hester Lyons

@HesterLyons ビルドがテスト中であるか、通常実行されているを知りたいだけだったので、テスト時にプロパティグラドル自体を追加して使用しました。あなたはここでコードを見ることができます:github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/…– CLOVIS '12
01/19

27

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

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

これを行うときは注意してください。呼び出し中にシステムプロパティが変更されると、Gradleの最新のチェックが簡単に破られる可能性があります。
thokuest

9

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

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

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


5

以下は、多数のプロジェクトプロパティをシステムプロパティとしてテストJVMに渡すバリアントです。柔軟性を高めるために、システムプロパティよりもプロジェクトプロパティを優先します。

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

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

 $ gradle intTest -Pfoo=1 -Pbar=2

そして、テストで取得します:

String foo = System.getProperty("foo");

System.getProperty("someprop")そのsubMapメソッドを使用して実行すると、の{someprop=foo}代わりに取得し ましたfoo。私はsystemProperty "foo", project.properties.subMap(["foo"]).get("foo")build.gradleで使用しなければなり
ませんでした

@YngvarKristiansenどこで(どのように)使っていましたsystemProperty "foo"か?つまり、これが使用されたコードの全行を確認するように求めていますか?私はこの質問で提案されているすべてを試していますが、それでもGradleは引数を渡していません。これが解決することを願っています!
Hester Lyons

@HesterLyons申し訳ありませんが、コードを保持していなかったため、もうわかりません:\不自然に見えることに同意します。
Yngvar Kristiansen

@YngvarKristiansenありがとうございます。その後、私の問題は、gradle.buildに含まれているjunit gradleプラグインが原因であることがわかりました。非常に奇妙な。
Hester Lyons

0

今日もその問題に遭遇しましたが、私にとってうまくいったのは次のとおりです。

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

-Penv = devを使用してテストタスクを呼び出しています。印刷で 'dev'値を取得します。値を送信しない場合は 'prod'を取得します。これは私にとって期待される動作です。

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

この問題に関する私の結論は、入力値(パラメーター)は実際にはSystemの下に格納され、System.properties ['env']またはSystem.getProperty( "env")のいずれかを介してアクセスできるようにする一方で、出力(システムプロパティ)はsystemPropertiesて、それが読みやすく配列、systemProperties [ 'ENV']

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.