Gradle ve -D aracılığıyla testime Sistem özelliği nasıl verilir


103

Sistem özelliğini okuyan bir Java programım var

System.getProperty("cassandra.ip");

ve başladığım bir Gradle derleme dosyam var

gradle test -Pcassandra.ip=192.168.33.13

veya

gradle test -Dcassandra.ip=192.168.33.13

ancak System.getProperty her zaman null döndürür .

Bulduğum tek yol, bunu Gradle derleme dosyama şu yolla eklemekti:

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

-D ile nasıl yaparım


1
Kullandığınızda ne olur gradle -Dcassandra.ip=192.168.33.13? Her neyse, test görevi bir veya birkaç yeni JVM'yi çatallar. Bu yüzden mülkleri açıkça geçirmeniz gerekecek. Yine de kimse sizi yapıdaki değerlerini kodlamaya zorlamaz.
JB Nizet

Ayrıca şu yanıta bir göz atın: stackoverflow.com/questions/23689054/…
IgalS

Yanıtlar:


127

-P bayrağı gradle özellikleri içindir ve -D bayrağı JVM özellikleri içindir. Test yeni bir JVM'de çatallanabileceğinden, gradle'a aktarılan -D argümanı teste yayılmayacaktır - gördüğünüz davranış buymuş gibi geliyor.

Yaptığınız gibi testbloğunuzdaki systemProperty özelliğini kullanabilirsiniz, ancak onu -P ile ileterek gelen gradle özelliğine dayandırabilirsiniz:

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

veya alternatif olarak, -D üzerinden iletiyorsanız

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

1
Bu benim için çalışmıyor ( System.getProperties().stringPropertyNames().forEach(System.out::println);Java kodu kullanılarak test edildi , görünmüyor)
CLOVIS

Uyarı: özellik bulunmazsa getPropertyatar MissingPropertyException. Bunun yerine Eron'un cevabını kullanın: stackoverflow.com/a/43112126/915441
Yngvar Kristiansen

1
Varsayılan değerleri ekleme için gradle.propertiesönleyecektir MissingPropertyException.
Duncan Calvert

Bu yöntemlerin hiçbirinin işe yaramasını sağlayamıyorum. Ne yaparsam yapayım myProperty her zaman boştur. Bu, aşağıda belirtilen tüm yöntemleri de içerir. Tüm yorumlar 2018'den olduğu için bunun daha yeni bir sürümle ilgisi olup olmadığını merak ediyorum. @CLOVIS buna bir çözüm buldunuz mu?
Hester Lyons

Ben sadece istediğim @HesterLyons bilmek eğer inşa çalışan normal test veya edildi ben test ederken kendisi ekler mülkiyet gradle kullanılan böylece; kodu burada görebilirsiniz: github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/…
CLOVIS

28

Bu çok fazla soruna rastladım, ancak gradle komut satırında komut satırında verilen tüm özellikleri tekrar listelemek istemiyorum. Bu nedenle tüm sistem özelliklerini testime gönderiyorum

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

Bunu yaparken dikkatli olun. Çağrılar sırasında sistem özellikleri değiştiğinde Gradle'ın güncel denetimlerini kolayca bozabilir.
thokuest

10

Test JVM'sine birden fazla sistem özelliğini geçirmem gereken bir durum yaşadım , ancak hepsini değil (ilgisiz olanları geçmek istemedim). Yukarıdaki cevaplara dayanarak ve subMapihtiyacım olanları filtrelemek için kullanarak , bu benim için çalıştı:

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

Bu örnekte, gradle'ın JVM'sinde varsa , yalnızca PROP1ve PROP2aktarılacaktır.


5

İşte çok sayıda proje özelliğini sistem özellikleri olarak test JVM'sine geçiren bir varyant. Esnekliği artırmak için proje özelliklerini sistem özelliklerine tercih ediyorum.

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

Komut satırından geçirilebilir:

 $ gradle intTest -Pfoo=1 -Pbar=2

Ve testinizde alındı:

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

Bu System.getProperty("someprop")subMap yöntemini kullanarak çalıştırırken , {someprop=foo}yerine aldım foo. systemProperty "foo", project.properties.subMap(["foo"]).get("foo")Build.gradle'da kullanmak zorunda kaldım
Yngvar Kristiansen

@YngvarKristiansen nerede (nasıl) kullanıyordunuz systemProperty "foo"? yani, bunun kullanıldığı kod satırının tamamını görmek istiyorum? Bu soruda önerilen her şeyi deniyorum ve hala Gradle herhangi bir argüman vermiyor. Bunun çözüleceğini umuyoruz!
Hester Lyons

@HesterLyons Üzgünüm, kodumu saklamadım, bu yüzden artık bilmiyorum: \ Yanlış göründüğüne katılıyorum.
Yngvar Kristiansen

Teşekkürler @YngvarKristiansen. O zamandan beri sorunumun gradle.build dosyamda bulunan junit gradle eklentisinden kaynaklandığını anladım. Çok tuhaf.
Hester Lyons

0

Bu yüzden bugün de bu sorunla karşılaştım ve benim için işe yarayan şuydu:

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

Test görevimi -Penv = dev kullanarak çağırıyorum ve baskımda 'dev' değerimi veya herhangi bir değer göndermezsem 'prod' alıyorum, bu benim için beklenen davranış.

Değere, System.getProperty ("env") kullanılarak java tarafında da erişilebilir .

Konuda Sonucum (parametre) aslında altında saklanır giriş değeridir Sistemi aracılığıyla ya da erişilebilir hale System.properties [ 'env'] veya System.getProperty ( "env") depolanır, çıkış ise (sistem özelliği) systemProperties ['env'] aracılığıyla okunabilir hale getiren bir systemProperties dizisi .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.