গ্রেডলে আমি কীভাবে একটি নতুন উত্সসেট যুক্ত করব?


101

আমি আমার গ্রেডল বিল্ড (সংস্করণ 1.0) এ সংহতকরণ পরীক্ষা যুক্ত করতে চাই। তাদের আমার স্বাভাবিক পরীক্ষাগুলি থেকে পৃথকভাবে চালানো উচিত কারণ তাদের একটি লোক্যাপ হোস্টে স্থাপন করার জন্য একটি ওয়েবঅ্যাপ প্রয়োজন (তারা সেই ওয়েব অ্যাপটি পরীক্ষা করে)। পরীক্ষাগুলি আমার প্রধান উত্স সেটে সংজ্ঞায়িত ক্লাস ব্যবহার করতে সক্ষম হওয়া উচিত। আমি এটি কীভাবে করব?

উত্তর:


116

এটি বের করতে আমার কিছুটা সময় লেগেছে এবং অনলাইন সংস্থানগুলি দুর্দান্ত ছিল না। তাই আমি আমার সমাধানটি নথিভুক্ত করতে চেয়েছিলাম।

এটি একটি সাধারণ গ্রেড বিল্ড স্ক্রিপ্ট যা প্রধান এবং পরীক্ষার উত্স সেট ছাড়াও একটি অন্তর্নিবেশ উত্স সেট করেছে:

apply plugin: "java"

sourceSets {
    // Note that just declaring this sourceset creates two configurations.
    intTest {
        java {
            compileClasspath += main.output
            runtimeClasspath += main.output
        }
    }
}

configurations {
    intTestCompile.extendsFrom testCompile
    intTestRuntime.extendsFrom testRuntime
}

task intTest(type:Test){
    description = "Run integration tests (located in src/intTest/...)."
    testClassesDir = project.sourceSets.intTest.output.classesDir
    classpath = project.sourceSets.intTest.runtimeClasspath
}

7
আপনাকে এখনও ইন্টিগ্রেশন টেস্ট টাস্কটি ডিক্লেয়ার এবং কনফিগার করতে হবে। ডকুমেন্টেশনের ক্ষেত্রে, java/withIntegrationTestsসম্পূর্ণ গ্রেডল বিতরণে একটি নমুনা রয়েছে।
পিটার নিডারউইজার

ধন্যবাদ @ পিটারনিডেরউইজার আমি আমার নমুনা বিল্ড স্ক্রিপ্টটি সংশোধন করেছি।
স্পিনা 13

4
আমিও এটি করার চেষ্টা করছিলাম ... সমাধান পোস্ট করার জন্য আপনাকে অনেক ধন্যবাদ :)
ইগর পপভ

@ পিটারনিডেরউইজার ধন্যবাদ - আপনি কি এটি লিঙ্ক করতে পারেন? আমি ডকসগুলিতে এই সঠিক পরিস্থিতিকে মারাত্মকভাবে অভাব দেখতে পেয়েছি: এটি একটি নতুন উত্সসেটকে সংজ্ঞায়িত করা সমস্ত ভাল এবং ভাল, তবে প্রকৃত সংকলন, জার, পরীক্ষা এবং হোয়াইটনোট টার্গেটগুলিকে "এটিকে হুক করা" সম্পর্কে কোনও তথ্য নেই - যেমন এই উদাহরণটি রয়েছে (যোগ করা ব্যতীত সেই সোর্সসেটের বাইরে জারে, বা একটি নতুন জার তৈরি করা)
stolsvik

Line নং লাইনে, ইন্টেলিজ ব্যবহার করার সময় আমি "জাভা প্রতীক" সমাধান করতে পারি না get কেন কোন চিন্তা?
স্নেকস

33

আমি ব্যবহার না করে এটি কীভাবে অর্জন করেছি তা এখানে configurations{ }

apply plugin: 'java'

sourceCompatibility = JavaVersion.VERSION_1_6

sourceSets {
    integrationTest {
        java {
            srcDir 'src/integrationtest/java'
        }
        resources {
            srcDir 'src/integrationtest/resources'
        }
        compileClasspath += sourceSets.main.runtimeClasspath
    }
}

task integrationTest(type: Test) {
    description = "Runs Integration Tests"
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath += sourceSets.integrationTest.runtimeClasspath
}

পরীক্ষিত: গ্রেডল 1.4 এবং গ্রেডল 1.6


4
ভাগ করে নেওয়ার জন্য ধন্যবাদ! বিকল্প বাস্তবায়ন দেখে ভাল।
স্পিনা

4
যদিও java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }এটি প্রাসঙ্গিক নয় কারণ এটি কেবল এটিকে আবার ঘোষনা src/<sourceSetName>/...করেছে src/integrationtest/...: এখানে: রাজধানী টি একটি নিম্ন টিতে পরিবর্তন করুন
চাইল্ডনো.ডে

এই পদ্ধতির থেকে সাবধান। compileClasspath += sourceSets.main.runtimeClasspathদুটি সেট ফাইলের সমন্বয় করছে। নির্ভরতার জন্য কোনও সাধারণ বিরোধের সমাধান নেই। আপনি একই লাইব্রেরির দুটি সংস্করণ দিয়ে শেষ করতে পারেন। প্রসারিত কনফিগারেশনগুলি এতে সহায়তা করবে।
চলিমার্টাইন

22

এটি একবার 2016 সালে গ্রেডেল 2.x / 3.x এর জন্য লেখা হয়েছিল এবং এটি অনেক পুরানো !! গ্রেডেল 4 এবং তারপরে ডকুমেন্টযুক্ত সমাধানগুলি দেখুন


উভয় পুরানো উত্তর যোগ করতে (উভয় বিশ্বের সেরা এবং সর্বনিম্ন কার্যকর):

প্রথমে কিছু উষ্ণ শব্দ:

  1. প্রথমত, আমাদের এটিকে সংজ্ঞায়িত করতে হবে sourceSet:

    sourceSets {
        integrationTest
    }
    
  2. এরপরে আমরা এর sourceSetথেকে প্রসারিত করব test, সেজন্য আমরা প্রাপ্ত test.runtimeClasspath( যেমন testএবং testতার থেকে সমস্ত নির্ভরতা অন্তর্ভুক্ত ) প্রাপ্ত ক্লাসপথ হিসাবে ব্যবহার করি sourceSet:

    sourceSets {
        integrationTest {
            compileClasspath += sourceSets.test.runtimeClasspath
            runtimeClasspath += sourceSets.test.runtimeClasspath // ***)
        }
    }
    
    • দ্রষ্টব্য ) কোনওভাবে এই পুনঃসংশোধন / প্রসারিত sourceSets.integrationTest.runtimeClasspathপ্রয়োজন তবে এটি অপ্রাসঙ্গিক হওয়া উচিত কারণ runtimeClasspathসর্বদা প্রসারিত হয় output + runtimeSourceSet, এটি পাবেন না
  3. আমরা কেবল ইন্টিগ্রেশন পরীক্ষা চালানোর জন্য একটি উত্সর্গীকৃত টাস্ককে সংজ্ঞায়িত করি:

    task integrationTest(type: Test) {
    }
    
  4. integrationTestপরীক্ষার ক্লাস এবং ক্লাসপাথ ব্যবহার কনফিগার করুন । javaপ্লাগইন থেকে ডিফল্টগুলি ব্যবহার করেtest sourceSet

    task integrationTest(type: Test) {
        testClassesDir = sourceSets.integrationTest.output.classesDir
        classpath = sourceSets.integrationTest.runtimeClasspath
    }
    
  5. (alচ্ছিক) পরীক্ষার পরে অটো চালানো

    ইন্টিগ্রেশনটেষ্ট.নির্ভরতা পরীক্ষা
    

  6. (alচ্ছিক) থেকে নির্ভরতা যুক্ত করুন check(তাই এটি সর্বদা চালিত হয় buildবা checkকার্যকর করা হয়)

    tasks.check.dependsOn(tasks.integrationTest)
    
  7. (sourceSet alচ্ছিক ) স্বয়ংক্রিয় সনাক্তকরণ সমর্থন করার জন্য জাভা, সংস্থান যোগ করুন এবং আপনার আইডিইতে এই "পার্টিয়াল" তৈরি করুন। অর্থাত্ ইন্টেলিজ আইডিইএ sourceSetপ্রতিটি সেটের জন্য ডিরেক্টরি জাভা এবং সংস্থানগুলি অস্তিত্ত্ব তৈরি করে:

    sourceSets {
         integrationTest {
             java
             resources
         }
    }
    

tl; ডা

apply plugin: 'java'

// apply the runtimeClasspath from "test" sourceSet to the new one
// to include any needed assets: test, main, test-dependencies and main-dependencies
sourceSets {
    integrationTest {
        // not necessary but nice for IDEa's
        java
        resources

        compileClasspath += sourceSets.test.runtimeClasspath
        // somehow this redeclaration is needed, but should be irrelevant
        // since runtimeClasspath always expands compileClasspath
        runtimeClasspath += sourceSets.test.runtimeClasspath
    }
}

// define custom test task for running integration tests
task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}
tasks.integrationTest.dependsOn(tasks.test)

উল্লেখ করা:

দুর্ভাগ্যক্রমে, github.com/gradle/gradle/subprojects/docs/src/sample/java/customizedLayout/build.gradle বা … / গ্রেড /… / ইন্টিগ্রেশন টেস্টস / বিল্ড. gradle এর উদাহরণ কোড এটি হ্যান্ডেল করে না বলে মনে হয় বা এর আলাদা কিছু আছে / আরও জটিল / আমার জন্য যাইহোক পরিষ্কার সমাধান নেই!


4
(!) হিসাবে দেখা যাচ্ছে, কনফিগারেশন বা আউটপুট ছাড়াই সোর্সসেট বর্ধনের একক ব্যবহারের ফলে ইনজেক্টটি ইনজেক্টলি প্রজেক্ট খোলার পরে ধারণাটিতে ত্রুটি তৈরি হয়। নতুন "মডিউল" (এখানে: ইন্টিগ্রেশন টেস্ট) এর জন্য বিল্ড নির্ভরতা (এখানে: পরীক্ষা) প্রথম পাওয়া যায় নাcompileTestJava
চাইল্ডন͡.ডে

4
classesDirclassesDirsডিগ্রি 5
গ্রেডে

@deFreitas ইঙ্গিতটির জন্য ধন্যবাদ, আমি উত্তরটি পুরানো হিসাবে চিহ্নিত করেছি
চাইল্ডনো.ডি

9

নীহারিকা-পল প্লাগইন ঘটিয়েছে boilerplate,:

apply plugin: 'nebula.facet'
facets {
    integrationTest {
        parentSourceSet = 'test'
    }
}

বিশেষত ইন্টিগ্রেশন পরীক্ষার জন্য, এমনকি এটি আপনার জন্য করা হয় , কেবল আবেদন করুন:

apply plugin: 'nebula.integtest'

প্রত্যেকের জন্য গ্রেডল প্লাগইন পোর্টাল লিঙ্কগুলি হ'ল:

  1. nebula.facet
  2. nebula.integtest

7

আপনি যদি ব্যবহার করছেন

পরীক্ষার উত্স রুট হিসাবে কাস্টম উত্সসেটকে স্বীকৃতি দেওয়ার জন্য ইন্টেলিজকে পেতে:

plugin {
    idea
}

idea {
    module {
        testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
        testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
    }
}

2

গ্রেডল ৪.০ হিসাবে আমার জন্য যা কাজ করে তা এখানে।

sourceSets {
  integrationTest {
    compileClasspath += sourceSets.test.compileClasspath
    runtimeClasspath += sourceSets.test.runtimeClasspath
  }
}

task integrationTest(type: Test) {
  description = "Runs the integration tests."
  group = 'verification'
  testClassesDirs = sourceSets.integrationTest.output.classesDirs
  classpath = sourceSets.integrationTest.runtimeClasspath
}

সংস্করণ ৪.০ হিসাবে, গ্রেডল এখন উত্স সেটে প্রতিটি ভাষার জন্য পৃথক শ্রেণি ডিরেক্টরি ব্যবহার করে। সুতরাং আপনার বিল্ড স্ক্রিপ্টটি যদি ব্যবহার করে তবে sourceSets.integrationTest.output.classesDirআপনি নীচের অবমাননার সতর্কতাটি দেখতে পাবেন।

গ্রেডল এখন প্রতিটি জেভিএম ভাষার জন্য পৃথক আউটপুট ডিরেক্টরি ব্যবহার করে, তবে এই বিল্ডটি উত্স সেট থেকে সমস্ত শ্রেণীর জন্য একটি একক ডিরেক্টরি অনুমান করে। এই আচরণটি অবহেলা করা হয়েছে এবং গ্রেডেল 5.0-এ সরানোর নির্ধারিত হয়েছে

এই সতর্কতা থেকে মুক্তি পেতে কেবল sourceSets.integrationTest.output.classesDirsপরিবর্তে স্যুইচ করুন। আরও তথ্যের জন্য, গ্রেডল ৪.০ প্রকাশের নোট দেখুন


<hmm> এ স্যুইচ করুন ?? আপনার আগে এবং পরে একই হয়।
Merk

-1

আমি গ্রেডলে নতুন, গ্রেডল 6.0.1 জুনিট 4.12 ব্যবহার করে। এই সমস্যাটি সমাধান করার জন্য আমি এখানে এলাম।

apply plugin: 'java'
repositories { jcenter() }

dependencies {
    testImplementation 'junit:junit:4.12'
}

sourceSets {
  main {
    java {
       srcDirs = ['src']
    }
  }
  test {
    java {
      srcDirs = ['tests']
    }
  }
}

লক্ষ্য করুন যে মূল উত্স এবং পরীক্ষার উত্স পৃথকভাবে রেফারেন্স করা হয়েছে, একের অধীনে mainএবং একের অধীনে test

testImplementationআইটেমটি অধীনে dependenciesশুধুমাত্র উৎস সংকলন জন্য ব্যবহার করা হয় test। যদি আপনার মূল কোডটির আসলে JUnit এর উপর নির্ভরতা ছিল, তবে আপনি এর implementationঅধীনেও নির্দিষ্ট করতে পারবেন dependencies

এটি কাজ করার জন্য আমাকে repositoriesবিভাগটি নির্দিষ্ট করতে হয়েছিল , আমি সন্দেহ করি যে এটিই সেরা / একমাত্র উপায়।

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