So geben Sie meinem Test über Gradle und -D die Eigenschaft System

102

Ich habe ein Java-Programm, das eine Systemeigenschaft liest

System.getProperty("cassandra.ip");

und ich habe eine Gradle-Build-Datei, mit der ich beginne

gradle test -Pcassandra.ip=192.168.33.13

oder

gradle test -Dcassandra.ip=192.168.33.13

jedoch System.getProperty wird immer wieder zurückkehren null .

Der einzige Weg, den ich gefunden habe, war, das in meine Gradle-Build-Datei über hinzuzufügen

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

Wie mache ich das über -D

Robkuz
quelle
1
Was passiert, wenn Sie verwenden gradle -Dcassandra.ip=192.168.33.13? Wie auch immer, die Testaufgabe gibt eine oder mehrere neue JVMs heraus. Sie müssen also Eigenschaften explizit übergeben. Niemand zwingt Sie jedoch dazu, ihren Wert im Build fest zu codieren.
JB Nizet
Schauen Sie sich auch diese Antwort an: stackoverflow.com/questions/23689054/…
IgalS

Antworten:

123

Das -P-Flag steht für Gradle-Eigenschaften und das -D-Flag für JVM-Eigenschaften. Da der Test möglicherweise in einer neuen JVM gegabelt wird, wird das an gradle übergebene -D-Argument nicht an den Test weitergegeben. Es scheint, dass dies das Verhalten ist, das Sie sehen.

Sie können die systemProperty in Ihrem testBlock wie bisher verwenden, sie jedoch auf der Eigenschaft eingehender Gradle basieren, indem Sie sie mit -P übergeben:

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

oder alternativ, wenn Sie es über -D übergeben

test {
    systemProperty "cassandra.ip", System.getProperty("cassandra.ip")
}
Jeff Storey
quelle
1
Dies funktioniert nicht für mich (getestet mit System.getProperties().stringPropertyNames().forEach(System.out::println);im Java-Code, es erscheint nicht)
CLOVIS
Warnung: Wird getPropertyausgelöst, MissingPropertyExceptionwenn keine Eigenschaft gefunden wird. Verwenden Sie stattdessen Erons
Yngvar Kristiansen
1
Durch Hinzufügen von Standardwerten gradle.propertieswird das verhindert MissingPropertyException.
Duncan Calvert
Ich kann keine dieser Methoden zum Laufen bringen. Was auch immer ich tue, myProperty ist immer null. Dies schließt auch alle unten genannten Methoden ein. Ich frage mich, ob dies etwas mit einer neueren Version zu tun hat, da alle Kommentare aus dem Jahr 2018 stammen. @CLOVIS hast du eine Lösung dafür gefunden?
Hester Lyons
@HesterLyons Ich wollte nur wissen, ob der Build getestet wurde oder normal ausgeführt wird, daher habe ich beim Testen die Eigenschaft verwendet, die gradle selbst hinzufügt. Sie können den Code hier sehen: github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/…
CLOVIS
27

Ist auf dieses Problem gestoßen, außer dass ich nicht alle Eigenschaften, die in der Befehlszeile angegeben sind, erneut im Gradle-Skript auflisten möchte. Deshalb sende ich alle Systemeigenschaften an meinen Test

task integrationTest(type: Test) {
    useTestNG()
    options {
        systemProperties(System.getProperties())
    }
}
MrSpock
quelle
Seien Sie dabei vorsichtig. Es kann leicht dazu führen, dass Gradles aktuelle Überprüfungen unterbrochen werden, wenn sich die Systemeigenschaften während des Aufrufs ändern.
10.
9

Ich hatte einen Fall, in dem ich mehrere Systemeigenschaften an die Test-JVM übergeben musste, aber nicht alle (wollte keine irrelevanten übergeben). Basierend auf den obigen Antworten und durch subMapFiltern der benötigten Antworten funktionierte dies für mich:

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

In diesem Beispiel nur PROP1und PROP2wird übergeben, wenn sie in der JVM von gradle vorhanden sind.

avivr
quelle
5

Hier ist eine Variante, die zahlreiche Projekteigenschaften als Systemeigenschaften an die Test-JVM übergibt. Ich bevorzuge Projekteigenschaften gegenüber Systemeigenschaften, um die Flexibilität zu erhöhen.

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

Was über die Kommandozeile übergeben werden kann:

 $ gradle intTest -Pfoo=1 -Pbar=2

Und in Ihrem Test abgerufen:

String foo = System.getProperty("foo");
Eron Wright
quelle
Bei der Ausführung System.getProperty("someprop")mit dieser SubMap-Methode habe ich {someprop=foo}statt foo. Ich musste systemProperty "foo", project.properties.subMap(["foo"]).get("foo")in build.gradle
Yngvar Kristiansen
@YngvarKristiansen wo (wie) haben Sie verwendet systemProperty "foo"? dh ich frage nach der vollständigen Codezeile, in der dies verwendet wurde? Ich versuche alles, was in dieser Frage vorgeschlagen wird, und dennoch gibt Gradle keine Argumente weiter. Ich hoffe, das könnte sich lösen!
Hester Lyons
@HesterLyons Es tut mir leid, ich habe meinen Code nicht behalten, daher weiß ich nicht mehr: \ Ich stimme zu, dass er fehl am Platz aussieht.
Yngvar Kristiansen
Vielen Dank, dass Sie @YngvarKristiansen. Ich habe seitdem herausgefunden, dass mein Problem durch das Junit Gradle Plugin verursacht wurde, das in meinem gradle.build enthalten war. Sehr komisch.
Hester Lyons
0

Daher bin ich auch heute über dieses Problem gestolpert, und was für mich funktioniert hat, war Folgendes:

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

Ich rufe meine Testaufgabe mit -Penv = dev auf und erhalte meinen 'dev'-Wert in meinem Druck oder' prod ', wenn ich keinen Wert sende, was für mich das erwartete Verhalten ist.

Auf den Wert kann auch auf der Java-Seite mit System.getProperty ("env") zugegriffen werden .

Meine Schlussfolgerung zu diesem Thema ist, dass der Eingabewert (Parameter) tatsächlich unter System gespeichert wird , sodass er entweder über System.properties ['env'] oder System.getProperty ("env") zugänglich ist , während die Ausgabe (Systemeigenschaft) in gespeichert wird ein systemProperties- Array, das über systemProperties ['env'] lesbar ist .

Olivier B.
quelle