গ্রেডল এবং-ডি এর মাধ্যমে কীভাবে আমার পরীক্ষায় সিস্টেম সম্পত্তি দেওয়া যায়


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"
}

আমি কীভাবে এটি-ডি এর মাধ্যমে করব


4
আপনি যখন ব্যবহার gradle -Dcassandra.ip=192.168.33.13করবেন তখন কি হয় ? যাইহোক, পরীক্ষার কাজটি এক বা একাধিক নতুন জেভিএম কাঁটাচামচ করে। সুতরাং আপনি স্পষ্টতই সম্পত্তি পাস করতে হবে। যদিও কেউ আপনাকে বিল্ডটিতে তাদের মান হার্ডকোড করতে বাধ্য করে না।
জেবি নিজেট

: এছাড়াও এই উত্তরে কটাক্ষপাত stackoverflow.com/questions/23689054/...
IgalS

উত্তর:


126

-P পতাকাটি গ্রেডের বৈশিষ্ট্যগুলির জন্য, এবং -D পতাকাটি JVM বৈশিষ্ট্যের জন্য। যেহেতু পরীক্ষাটি কোনও নতুন জেভিএমে ফোরকড হতে পারে, গ্রেডে পাস করা -D আর্গুমেন্টটি পরীক্ষায় প্রচার করা হবে না - মনে হচ্ছে এটি সেই আচরণ যা আপনি দেখছেন।

আপনি testযেমনটি করেছেন তেমন আপনি আপনার ব্লকে সিস্টেমপ্রোপার্টিটি ব্যবহার করতে পারেন তবে আগত গ্রেডের সম্পত্তিটিকে এটি দিয়ে পাস করার মাধ্যমে এটি বেস করুন:

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

অথবা বিকল্পভাবে, যদি আপনি এটি -D এর মাধ্যমে পাস করেন

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

4
এটি আমার জন্য কাজ করে না ( System.getProperties().stringPropertyNames().forEach(System.out::println);জাভা কোড ব্যবহার করে পরীক্ষিত , এটি প্রদর্শিত হয় না)
ক্লোভিস

সতর্কতা: সম্পত্তি না পাওয়া গেলে getPropertyছুড়ে দেয় MissingPropertyException। এর পরিবর্তে ইরানের উত্তরটি ব্যবহার করুন: stackoverflow.com/a/43112126/915441
ইয়াংভার ক্রিশ্চিয়েনসেন

4
এতে ডিফল্ট মান যুক্ত করা gradle.propertiesরোধ করবে MissingPropertyException
ডানকান কালভার্ট

আমি এই পদ্ধতির কোনওটিই কাজ করতে পারি না। আমি মাইপ্রোপার্টি যাই করি না কেন সর্বদা শূন্য থাকে। এর মধ্যে নীচে উল্লিখিত সমস্ত পদ্ধতি অন্তর্ভুক্ত রয়েছে। আমি ভাবছি যে এটি কি আরও সাম্প্রতিক সংস্করণে কিছু করার জন্য, যেমন সমস্ত মন্তব্যগুলি 2018? @ CLOVIS আপনি কি এর সমাধান খুঁজে পেয়েছেন?
হস্টার লিওনস

@ হেস্টারলোনস আমি কেবল জানতে চেয়েছিলাম যে বিল্ডটি পরীক্ষা করা হচ্ছে বা সাধারণত চলছে কিনা , তাই আমি পরীক্ষার সময় সম্পত্তি গ্রেড নিজেই যুক্ত করেছিলাম; : আপনি এখানে কোড দেখতে পারেন github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/...
Clovis

28

আমি খুব গ্রেড স্ক্রিপ্টে কমান্ডলাইনে প্রদত্ত সমস্ত সম্পত্তি আবার তালিকাভুক্ত করতে চাই না, এই খুব সমস্যার মধ্যে এসে পড়ে। অতএব আমি আমার পরীক্ষায় সমস্ত সিস্টেমের বৈশিষ্ট্য প্রেরণ করি

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

এটি করার সময় সাবধানতা অবলম্বন করুন। যখন অনুরোধের সময় সিস্টেমের বৈশিষ্ট্যগুলি পরিবর্তন হয় এটি গ্রেডলের আপ টু ডেট পরীক্ষা খুব সহজেই ভেঙে দিতে পারে।
থোকুয়েস্ট

10

আমার একটি কেস হয়েছিল যেখানে আমার একাধিক সিস্টেমের সম্পত্তি JVM পরীক্ষায় পাস করার দরকার ছিল তবে সমস্ত নয় (অপ্রাসঙ্গিক ক্ষেত্রে পাস করতে চান না)। উপরের উত্তরের উপর ভিত্তি করে, এবং 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")যে subMap পদ্ধতি ব্যবহার করে, আমি পেয়েছিলাম {someprop=foo}পরিবর্তে foo। আমাকে systemProperty "foo", project.properties.subMap(["foo"]).get("foo")বিল্ড.gradle
ক্রিশ্চিয়েনসেন

@ YngvarKristiansen আপনি কোথায় (কীভাবে) ব্যবহার করছেন systemProperty "foo"? অর্থাত্ আমি কোডটির সম্পূর্ণ লাইনটি দেখতে বলছি যেখানে এটি ব্যবহৃত হয়েছিল? আমি এই প্রশ্নে প্রস্তাবিত সবকিছু চেষ্টা করছি এবং এখনও গ্রেডল কোনও যুক্তি দিচ্ছে না। আশা করছি এটি সমাধান হতে পারে!
হস্টার লিওনস

@ হেস্টারলোনস আমি দুঃখিত, আমি আমার কোড রাখি না, তাই আমি আর জানি না: \ আমি সম্মত হলাম যে এটির জায়গাটি বাহ্যিক দেখাচ্ছে।
ইয়েঙ্গ্বর ক্রিশ্চিয়েনসেন

আপনাকে ধন্যবাদ ইয়ংবারক্রিস্টিয়ানসন আমি তখন থেকে কাজ করেছি যে আমার সমস্যা জুনিট গ্রেডেল প্লাগইন যা আমার গ্রেড.বিল্ডের অন্তর্ভুক্ত ছিল তার কারণে ঘটছিল। খুব অদ্ভুত.
হেস্টার লিওনস

0

সুতরাং আমি আজও সেই সমস্যাটিতে হোঁচট খেয়েছি, এবং আমার জন্য যা কাজ করেছে তা নিম্নলিখিত ছিল:

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

আমি আমার টেস্ট টাস্ককে পেনভ = দেব ব্যবহার করে বলছি এবং আমি আমার মুদ্রণে আমার 'দেব' মান পাই, বা যদি আমি কোনও মান না প্রেরণ করি তবে 'প্রোড' পাই যা আমার জন্য প্রত্যাশিত আচরণ।

System.getProperty ("env") ব্যবহার করে মানটি জাভা সাইডেও অ্যাক্সেসযোগ্য ।

বিষয়টি সম্পর্কে আমার উপসংহারটি হ'ল ইনপুট মান (পরামিতি) আসলে সিস্টেমের অধীনে সঞ্চিত থাকে , এটি সিস্টেম.প্রপ্রেটিস ['এনভি'] বা সিস্টেম.জেটপ্রোপার্টি ("এনভিভি") এর মাধ্যমে অ্যাক্সেসযোগ্য করে তোলে , যেখানে আউটপুট (সিস্টেমের সম্পত্তি) এতে সঞ্চিত থাকে একটি systemProperties এরে, এটা মাধ্যমে পাঠযোগ্য উপার্জন systemProperties [ 'env']

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.