วิธีให้คุณสมบัติของระบบกับการทดสอบของฉันผ่าน Gradle และ -D


103

ฉันมีโปรแกรม 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? อย่างไรก็ตามงานทดสอบจะแยก JVM ใหม่หนึ่งรายการหรือหลายรายการ ดังนั้นคุณจะต้องผ่านคุณสมบัติอย่างชัดเจน แม้ว่าจะไม่มีใครบังคับให้คุณกำหนดค่าของพวกเขาในงานสร้างแน่นอน
JB Nizet

ลองดูในคำตอบนี้stackoverflow.com/questions/23689054/…
IgalS

คำตอบ:


127

แฟล็ก -P ใช้สำหรับคุณสมบัติการไล่ระดับสีและแฟล็ก -D ใช้สำหรับคุณสมบัติ JVM เนื่องจากการทดสอบอาจถูกแยกใน JVM ใหม่อาร์กิวเมนต์ -D ที่ส่งผ่านไปยัง gradle จะไม่ถูกเผยแพร่ไปยังการทดสอบ - ดูเหมือนว่าจะเป็นพฤติกรรมที่คุณเห็น

คุณสามารถใช้ systemProperty ในtestบล็อกของคุณได้เช่นเดียวกับที่คุณทำ แต่ยึดตามคุณสมบัติ 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.
Duncan Calvert

ฉันไม่สามารถใช้วิธีการทั้งสองนี้ได้ผล สิ่งที่ฉันทำ myProperty จะเป็นโมฆะเสมอ ซึ่งรวมถึงวิธีการทั้งหมดที่กล่าวถึงด้านล่างด้วย ฉันสงสัยว่านี่เป็นสิ่งที่เกี่ยวข้องกับเวอร์ชันล่าสุดหรือไม่เนื่องจากความคิดเห็นทั้งหมดมาจากปี 2018? @CLOVIS คุณพบวิธีแก้ปัญหานี้หรือไม่?
Hester Lyons

@HesterLyons ฉันต้องการเพียงเพื่อที่จะรู้ว่าถ้าสร้างถูกทดสอบหรือปกติทำงานดังนั้นผมจึงใช้ gradle คุณสมบัติตัวเองเพิ่มเมื่อการทดสอบ; สามารถดูรหัสได้ที่นี่: github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/…
CLOVIS

28

เจอปัญหานี้มากยกเว้นฉันไม่ต้องการแสดงรายการคุณสมบัติทั้งหมดที่ให้ไว้ในบรรทัดคำสั่งในสคริปต์ gradle อีกครั้ง ดังนั้นฉันจึงส่งคุณสมบัติของระบบทั้งหมดไปยังการทดสอบของฉัน

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

ระมัดระวังเมื่อทำเช่นนี้ มันอาจทำลายการตรวจสอบล่าสุดของ Gradle ได้อย่างง่ายดายเมื่อคุณสมบัติของระบบเปลี่ยนแปลงในระหว่างการเรียกใช้
thokuest

10

ฉันมีกรณีที่ฉันต้องส่งคุณสมบัติของระบบหลายรายการไปยัง JVM การทดสอบ แต่ไม่ใช่ทั้งหมด (ไม่ต้องการส่งผ่านในคุณสมบัติที่ไม่เกี่ยวข้อง) จากคำตอบข้างต้นและโดยใช้subMapเพื่อกรองสิ่งที่ฉันต้องการสิ่งนี้ได้ผลสำหรับฉัน:

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

ในตัวอย่างนี้เท่านั้นPROP1และPROP2จะถูกส่งต่อหากมีอยู่ใน JVM ของ gradle


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
Yngvar Kristiansen

@YngvarKristiansen คุณใช้ (อย่างไร) systemProperty "foo"ที่ไหน? เช่นฉันขอดูบรรทัดเต็มของรหัสที่ใช้? ฉันพยายามทุกอย่างที่แนะนำในคำถามนี้ แต่ Gradle ยังไม่ผ่านข้อโต้แย้งใด ๆ หวังว่าสิ่งนี้จะแก้ไขได้!
Hester Lyons

@HesterLyons ฉันขอโทษฉันไม่ได้เก็บรหัสของฉันดังนั้นฉันจึงไม่รู้อีกต่อไป: \ ฉันยอมรับว่ามันดูผิดที่
Yngvar Kristiansen

ขอบคุณ @YngvarKristiansen ฉันได้ตรวจสอบแล้วว่าปัญหาของฉันเกิดจากปลั๊กอิน junit gradle ซึ่งรวมอยู่ใน gradle.build ของฉัน แปลกมาก.
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")

ข้อสรุปของฉันเกี่ยวกับเรื่องนี้คือค่าอินพุต (พารามิเตอร์) ถูกเก็บไว้ในระบบทำให้สามารถเข้าถึงได้ผ่านSystem.properties ['env']หรือSystem.getProperty ("env")ในขณะที่เอาต์พุต (คุณสมบัติระบบ) ถูกเก็บไว้ในsystemPropertiesอาร์เรย์ทำให้สามารถอ่านได้ผ่านsystemProperties [ 'env']

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.