ग्रैडल और -ड के माध्यम से मेरे परीक्षण के लिए सिस्टम संपत्ति कैसे दें


103

मेरे पास एक जावा प्रोग्राम है जो एक सिस्टम प्रॉपर्टी को पढ़ता है

System.getProperty("cassandra.ip");

और मेरे पास एक ग्रैड बिल्ड फाइल है जिसे मैं शुरू करता हूं

gradle test -Pcassandra.ip=192.168.33.13

या

gradle test -Dcassandra.ip=192.168.33.13

हालाँकि, System.getProperty हमेशा अशक्त रहेगी ।

एक ही रास्ता मुझे मिल गया था कि मेरे ग्रेडल फ़ाइल के माध्यम से जोड़ने के लिए

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

मैं इसे कैसे करता हूँ -D के माध्यम से


1
जब आप उपयोग करते हैं तो क्या होता है gradle -Dcassandra.ip=192.168.33.13? वैसे भी, परीक्षण कार्य एक या कई नए JVMs की मांग करता है। इसलिए आपको संपत्तियों को आसानी से पास करना होगा। कोई भी आपको बिल्ड में उनके मूल्य को हार्डकोड करने के लिए मजबूर नहीं करता है, हालांकि
जेबी निजेट

इस उत्तर पर भी एक नज़र डालें: stackoverflow.com/questions/23689054/…
IgalS

जवाबों:


125

-पी ध्वज प्रवण गुणों के लिए है, और -D ध्वज JVM गुणों के लिए है। क्योंकि परीक्षण को एक नए JVM में कांटा जा सकता है, -D तर्क को पास करने के लिए परीक्षण में प्रचारित नहीं किया जाएगा - ऐसा लगता है कि जैसा व्यवहार आप देख रहे हैं।

आप अपने testब्लॉक में systemProperty का उपयोग कर सकते हैं जैसा कि आपने किया है, लेकिन इसे इसके साथ पास करके आने वाली संपत्तियों की संपत्ति के आधार पर।

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);जावा कोड में, यह प्रकट नहीं होता है)
CLOVIS

चेतावनी: यदि संपत्ति नहीं मिली तो getPropertyफेंकता MissingPropertyExceptionहै। इसके बजाय एरोन के उत्तर का उपयोग करें: stackoverflow.com/a/43112126/915441
यंगवार क्रिस्टियनसेन

1
डिफ़ॉल्ट मान जोड़ने gradle.propertiesसे रोका जा सकेगा MissingPropertyException
डंकन कलवर्ट

मुझे इनमें से कोई भी तरीका काम नहीं कर सकता। मैं जो कुछ भी करता हूं वह हमेशा ठीक रहता है। इसमें नीचे बताए गए सभी तरीके भी शामिल हैं। मैं सोच रहा हूं कि क्या यह हाल के संस्करण के साथ कुछ करना है, क्योंकि सभी टिप्पणियां 2018 से हैं? @CLOVIS क्या आपको इसका हल मिला?
हेस्टर लियोन

@HesterLyons मैं केवल यह जानना चाहता था कि क्या निर्माण परीक्षण या सामान्य रूप से चल रहा था, इसलिए मैंने परीक्षण के समय संपत्ति के गुणन को स्वयं जोड़ा; आप यहाँ कोड देख सकते हैं: github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/…
CLOVIS

27

यह बहुत अधिक समस्या है, सिवाय इसके कि मैं फिर से वर्गीकृत स्क्रिप्ट में कमांडलाइन पर दिए गए सभी गुणों को सूचीबद्ध नहीं करना चाहता। इसलिए मैं अपने परीक्षण के लिए सभी सिस्टम गुण भेजता हूं

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

ऐसा करते समय सावधान रहें। यह आसानी से ग्रेड के अप-टू-डेट चेक को तोड़ सकता है जब सिस्टम गुण इनवोकेशन के दौरान बदलते हैं।
14

9

मेरे पास एक ऐसा मामला था जहां मुझे परीक्षण प्रणाली में कई प्रणाली गुणों को पारित करने की आवश्यकता थी, लेकिन सभी (अप्रासंगिक लोगों में पारित नहीं करना चाहते थे)। उपरोक्त उत्तरों के आधार पर, और subMapजिन लोगों को मेरी ज़रूरत थी, उन्हें फ़िल्टर करने के लिए, इसने मेरे लिए काम किया:

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

इस उदाहरण में, केवल PROP1और पास किया PROP2जाएगा, यदि वे ग्रेडेल के जेवीएम में मौजूद हैं।


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")उस उप-मानचित्र विधि का उपयोग करते हुए, मुझे इसके {someprop=foo}बजाय मिला foo। मुझे systemProperty "foo", project.properties.subMap(["foo"]).get("foo")
बजे

@YngvarKristiansen आप कहाँ (कैसे) का उपयोग कर रहे थे systemProperty "foo"? यानी मैं कोड की पूरी लाइन देखने के लिए कह रहा हूँ जहाँ इसका उपयोग किया गया था? मैं इस सवाल में सुझाई गई हर चीज की कोशिश कर रहा हूं और फिर भी ग्रैडल किसी भी तर्क को पारित नहीं कर रहा है। यह उम्मीद कर सकता है!
हेस्टर लियोन

@HesterLyons मुझे क्षमा करें, मैंने अपना कोड नहीं रखा था, इसलिए मुझे अब पता नहीं है: \ _ मैं मानता हूं कि यह जगह से बाहर है।
यंगवार कृतिसेन

साभार @YngvarKristiansen मैंने तब से काम किया है कि मेरी समस्या जूनिनियर ग्रेडल प्लगइन के कारण हो रही थी जो मेरे gradle.build में शामिल था। बहुत अजीब।
हेस्टर लियोन्स

0

इसलिए मैं आज भी उस मुद्दे पर लड़ रहा हूँ, और मेरे लिए जो काम किया वह निम्नलिखित था:

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

मैं अपने परीक्षण कार्य का उपयोग कर रहा हूं -पेंव = देव का उपयोग कर रहा हूं और अगर मुझे कोई मूल्य नहीं भेजा जाता है, तो मेरे प्रिंट, या 'ठेस' में मुझे अपना 'देव' मूल्य मिलता है, जो मेरे लिए अपेक्षित व्यवहार है।

System.getProperty ("env") का उपयोग करके जावा पक्ष पर मान भी सुलभ है ।

इस मामले पर मेरा निष्कर्ष यह है कि इनपुट वैल्यू (पैरामीटर) वास्तव में सिस्टम के तहत संग्रहित है , जो इसे System.properties ['env'] या System.getProperty ("env") के माध्यम से सुलभ बनाता है , जबकि आउटपुट (सिस्टम प्रॉपर्टी) संग्रहीत किया जाता है एक systemProperties सरणी, जो इसे systemProperties ['env'] के माध्यम से पठनीय बनाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.