web-dev-qa-db-fra.com

Comment donner la propriété System à mon test via Gradle et -D

J'ai un programme Java qui lit une propriété System

System.getProperty("cassandra.ip");

et j'ai un fichier de construction Gradle avec lequel je commence

gradle test -Pcassandra.ip=192.168.33.13

ou

gradle test -Dcassandra.ip=192.168.33.13

cependant System.getProperty retournera toujours null.

Le seul moyen que j’ai trouvé était d’ajouter cela dans mon fichier de construction Gradle via

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

Comment puis-je le faire via -D

75
robkuz

L'indicateur -P concerne les propriétés de dégradé et l'indicateur -D concerne les propriétés de la machine virtuelle Java. Etant donné que le test peut être créé dans une nouvelle machine virtuelle, l'argument -D transmis à gradle ne sera pas transmis au test. Il semble que ce soit le comportement que vous observez.

Vous pouvez utiliser la propriété systemProperty dans votre bloc test comme vous l'avez fait, mais basez-la sur la propriété gradle entrante en la passant avec -P:

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

ou alternativement, si vous le passez via -D

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

Je suis tombé sur ce très gros problème, sauf que je ne veux pas lister à nouveau toutes les propriétés données sur la ligne de commande dans le script Gradle. Par conséquent, j'envoie toutes les propriétés du système à mon test

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

J'ai eu un cas où je devais passer plusieurs propriétés système dans la machine virtuelle de test, mais pas tous (je ne voulais pas transmettre les propriétés non pertinentes). Basé sur les réponses ci-dessus, et en utilisant subMap pour filtrer ceux dont j'avais besoin, cela a fonctionné pour moi:

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

Dans cet exemple, seul PROP1 et PROP2 seront passés, s’ils existent dans la JVM de Gradle.

8
avivr

Voici une variante qui transmet de nombreuses propriétés de projet à la JVM test en tant que propriétés système. Je préfère les propriétés de projet aux propriétés de système pour augmenter la flexibilité.

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

Ce qui peut être passé sur la ligne de commande:

 $ gradle intTest -Pfoo=1 -Pbar=2

Et récupéré dans votre test:

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

Donc, je suis tombé sur cette question aujourd'hui aussi, et ce qui a fonctionné pour moi a été le suivant:

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

J'appelle ma tâche de test à l'aide de - Penv = dev et j'obtiens la valeur "dev" dans mon impression, ou "prod" si je n'envoie aucune valeur, ce qui correspond au comportement attendu pour moi. .

La valeur est également accessible du côté Java, en utilisant System.getProperty ("env")).

Ma conclusion à ce sujet est que la valeur d'entrée (paramètre) est actuellement stockée sous System, ce qui la rend accessible via System.properties ['env'] ou System.getProperty ("env"), alors que la sortie (propriété système) est stockée dans un tableau systemProperties, ce qui le rend lisible via systemProperties ['env'].

0
Olivier B.