Cara memberikan properti Sistem ke pengujian saya melalui Gradle dan -D

103

Saya memiliki program Java yang membaca properti Sistem

System.getProperty("cassandra.ip");

dan saya memiliki file build Gradle yang saya mulai

gradle test -Pcassandra.ip=192.168.33.13

atau

gradle test -Dcassandra.ip=192.168.33.13

namun System.getProperty akan selalu mengembalikan null .

Satu-satunya cara yang saya temukan adalah menambahkannya ke file build Gradle saya melalui

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

Bagaimana Saya melakukannya melalui -D

robkuz
sumber
1
Apa yang terjadi saat Anda menggunakan gradle -Dcassandra.ip=192.168.33.13? Bagaimanapun, tugas pengujian membagi satu atau beberapa JVM baru. Jadi, Anda harus meneruskan properti secara eksplisit. Tidak ada yang memaksa Anda untuk melakukan hardcode nilai mereka dalam build.
JB Nizet
Lihat juga jawaban ini: stackoverflow.com/questions/23689054/…
IgalS

Jawaban:

123

Bendera -P untuk properti gradle, dan tanda -D untuk properti JVM. Karena pengujian mungkin bercabang dalam JVM baru, argumen -D yang diteruskan ke gradle tidak akan disebarkan ke pengujian - sepertinya itulah perilaku yang Anda lihat.

Anda dapat menggunakan systemProperty di testblok Anda seperti yang telah Anda lakukan tetapi mendasarkannya pada properti gradle yang masuk dengan meneruskannya dengan -P:

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

atau sebagai alternatif, jika Anda mengirimkannya melalui -D

test {
    systemProperty "cassandra.ip", System.getProperty("cassandra.ip")
}
Jeff Storey
sumber
1
Ini tidak berhasil untuk saya (diuji menggunakan System.getProperties().stringPropertyNames().forEach(System.out::println);dalam kode Java, tidak muncul)
CLOVIS
Peringatan: getPropertymelempar MissingPropertyExceptionjika properti tidak ditemukan. Gunakan jawaban Eron sebagai gantinya: stackoverflow.com/a/43112126/915441
Yngvar Kristiansen
1
Menambahkan nilai default ke gradle.propertiesakan mencegah MissingPropertyException.
Duncan Calvert
Saya tidak bisa mendapatkan salah satu dari metode ini untuk bekerja. Apapun yang saya lakukan myProperty selalu null. Ini mencakup semua metode yang disebutkan di bawah ini juga. Saya bertanya-tanya apakah ini ada hubungannya dengan versi yang lebih baru, karena semua komentar berasal dari 2018? @CLOVIS apakah Anda menemukan solusi untuk ini?
Hester Lyons
@HesterLyons Saya hanya ingin tahu apakah build sedang diuji atau berjalan normal, jadi saya menggunakan properti gradle itu sendiri yang ditambahkan saat menguji; Anda dapat melihat kodenya di sini: github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/…
CLOVIS
27

Menemukan banyak masalah ini, kecuali saya tidak ingin membuat daftar semua properti yang diberikan pada baris perintah dalam skrip gradle lagi. Oleh karena itu saya mengirim semua properti sistem untuk pengujian saya

task integrationTest(type: Test) {
    useTestNG()
    options {
        systemProperties(System.getProperties())
    }
}
MrSpock
sumber
Berhati-hatilah saat melakukan ini. Ini mungkin dengan mudah merusak pemeriksaan terbaru Gradle ketika properti sistem berubah selama pemanggilan.
Tamu
9

Saya punya kasus di mana saya harus meneruskan beberapa properti sistem ke dalam pengujian JVM tetapi tidak semua (tidak ingin lulus di yang tidak relevan). Berdasarkan jawaban di atas, dan dengan menggunakan subMapuntuk memfilter yang saya butuhkan, ini berhasil untuk saya:

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

Dalam contoh ini, hanya PROP1dan PROP2akan diteruskan, jika ada di JVM gradle.

avivr
sumber
5

Berikut adalah varian yang meneruskan banyak properti proyek untuk menguji JVM sebagai properti sistem. Saya lebih suka properti proyek daripada properti sistem untuk meningkatkan fleksibilitas.

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

Yang mungkin diteruskan pada baris perintah:

 $ gradle intTest -Pfoo=1 -Pbar=2

Dan diambil dalam pengujian Anda:

String foo = System.getProperty("foo");
Eron Wright
sumber
Saat menjalankan System.getProperty("someprop")menggunakan metode subMap, saya mendapatkan {someprop=foo}alih - alih foo. Saya harus menggunakan systemProperty "foo", project.properties.subMap(["foo"]).get("foo")di build.gradle
Yngvar Kristiansen
@YngvarKristiansen dimana (bagaimana) yang Anda gunakan systemProperty "foo"? yaitu saya meminta untuk melihat baris lengkap kode di mana ini digunakan? Saya mencoba semua yang disarankan dalam pertanyaan ini dan Gradle tetap tidak memberikan argumen apa pun. Berharap ini bisa diselesaikan!
Hester Lyons
@HesterLyons Maaf, saya tidak menyimpan kode saya, jadi saya tidak tahu lagi: \ Saya setuju bahwa ini terlihat tidak pada tempatnya.
Yngvar Kristiansen
Terima kasih @YngvarKristiansen. Saya telah mengetahui bahwa masalah saya disebabkan oleh plugin junit gradle yang disertakan dalam gradle.build saya. Sangat aneh.
Hester Lyons
0

Jadi saya telah tersandung pada masalah itu hari ini juga, dan yang berhasil untuk saya adalah sebagai berikut:

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

Saya memanggil tugas pengujian saya menggunakan -Penv = dev dan saya mendapatkan nilai 'dev' di cetakan saya, atau 'prod' jika saya tidak mengirim nilai apa pun, yang merupakan perilaku yang diharapkan untuk saya.

Nilai juga dapat diakses di sisi java, menggunakan System.getProperty ("env") .

Kesimpulan saya tentang masalah ini adalah bahwa nilai input (parameter) sebenarnya disimpan di bawah Sistem , membuatnya dapat diakses melalui System.properties ['env'] atau System.getProperty ("env") , sedangkan output (properti sistem) disimpan di sebuah systemProperties array, sehingga dapat dibaca melalui systemProperties [ 'env'] .

Olivier B.
sumber