मैं ग्रेडेल में एक नया स्रोत कैसे जोड़ूं?


99

मैं अपने ग्रेड निर्माण (संस्करण 1.0) में एकीकरण परीक्षण जोड़ना चाहता हूं। उन्हें मेरे सामान्य परीक्षणों से अलग चलना चाहिए क्योंकि उन्हें लोकलहोस्ट पर तैनात होने के लिए एक वेबएप की आवश्यकता होती है (वे उस वेबएप्प का परीक्षण करते हैं)। परीक्षण मेरे मुख्य स्रोत सेट में परिभाषित कक्षाओं का उपयोग करने में सक्षम होना चाहिए। मैं यह कैसे कर सकता हूँ?

जवाबों:


114

मुझे यह पता लगाने में थोड़ा समय लगा और ऑनलाइन संसाधन महान नहीं थे। इसलिए मैं अपने समाधान का दस्तावेज बनाना चाहता था।

यह एक सरल श्रेणी निर्माण स्क्रिप्ट है जिसमें मुख्य और परीक्षण स्रोत सेट के अलावा एक अंतरतम स्रोत सेट है:

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में, पूर्ण स्नातक वितरण में एक नमूना है।
पीटर निडरविज़र

धन्यवाद @PeterNiederwieser मैंने अपना नमूना निर्माण स्क्रिप्ट सही किया है।
Spina

2
मैं यह भी करने की कोशिश कर रहा था ... समाधान पोस्ट करने के लिए बहुत-बहुत धन्यवाद :)
इगोर पोपोव

@PeterNiederwieser धन्यवाद - क्या आप इसे लिंक कर सकते हैं? मुझे यह भी पता चलता है कि इस सटीक स्थिति में डॉक्स की भारी कमी है: यह एक नए सोर्ससेट को अच्छी तरह से परिभाषित करने के लिए सभी अच्छी तरह से और अच्छा है, लेकिन वास्तविक संकलन, जार, टेस्ट और व्हाट्स टारगेट में "इसे हुक करने" के बारे में कोई जानकारी नहीं है - जैसा कि इस उदाहरण में है (जोड़ने के अलावा) जार में, या उस स्रोत से बाहर एक नया जार बना रहा है)।
स्टॉल्सविक

IntelliJ का उपयोग करते समय लाइन 6 पर, मुझे "java" का प्रतीक नहीं मिल सकता है। कोई विचार क्यों?
स्नेकसे

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


2
साझा करने के लिए धन्यवाद! वैकल्पिक कार्यान्वयन को देखना अच्छा है।
स्पाइना

1
हालांकि java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }यह प्रासंगिक नहीं है क्योंकि यह केवल इस पर पुनर्विचार src/<sourceSetName>/...करता है src/integrationtest/...: यहां: राजधानी को एक निम्न टी में बदल दें
childno͡.de

इस दृष्टिकोण से सावधान रहें। compileClasspath += sourceSets.main.runtimeClasspathफ़ाइलों के दो सेट को मिला रहा है। निर्भरता के लिए कोई सामान्य संघर्ष समाधान नहीं है। आप एक ही पुस्तकालय के दो संस्करणों के साथ समाप्त कर सकते हैं। विन्यास को बढ़ाने में मदद मिलेगी।
chalimartines

20

यह एक बार 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. (वैकल्पिक) परीक्षण के बाद ऑटो चलाते हैं

    एकीकरण। परीक्षण। परीक्षण
    

  6. (वैकल्पिक) से निर्भरता जोड़ें check(इसलिए यह हमेशा चलता है buildया checkनिष्पादित होने पर)

    tasks.check.dependsOn(tasks.integrationTest)
  7. (वैकल्पिक) जावा का sourceSetपता लगाएं, ऑटो-डिटेक्शन का समर्थन करने के लिए संसाधन और अपने आईडीई में ये "पार्टियल" बनाएं। यानी इंटेलीजे आईडीईए 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/samples/java/customizedLayout/build.gradle या ... / gradle / / withIntegrationTests / build.gradle पर उदाहरण कोड इस को संभालने के लिए नहीं लगता है या एक अलग है। / अधिक जटिल / मेरे लिए वैसे भी कोई स्पष्ट समाधान नहीं!


1
(!) जैसा कि यह पता चला है, कॉन्फ़िगरेशन या आउटपुट के बिना sourceSet एन्हांसमेंट का एकल उपयोग एक प्रोजेक्ट खोलने के बाद विचार में त्रुटि करता है। नए "मॉड्यूल" के लिए बिल्ड डिपेंडेंसी (यहां: टेस्ट) (यहां: इंटीग्रेशनटेस्ट) पहली बार उपलब्ध नहीं हैcompileTestJava
चाइल्डनो

2
classesDirके लिए चले गया था classesDirsGradle 5 पर
deFreitas

संकेत @deFreitas के लिए धन्यवाद, मैंने उत्तर को पुराने के रूप में चिह्नित किया
childnode.de

9

निहारिका-पहलू प्लगइन को हटा बॉयलरप्लेट:

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

एकीकरण परीक्षणों के लिए विशेष रूप से, यहां तक ​​कि यह आपके लिए किया जाता है , बस लागू करें:

apply plugin: 'nebula.integtest'

प्रत्येक के लिए ग्रेड प्लगइन पोर्टल लिंक हैं:

  1. nebula.facet
  2. nebula.integtest

7

यदि आप उपयोग कर रहे हैं

टेस्ट सोर्स के रूप में कस्टम स्रोतों को पहचानने के लिए IntelliJ प्राप्त करना:

plugin {
    idea
}

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

2

यहाँ क्या मेरे लिए ग्रेड 4.0 के रूप में काम करता है।

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
}

संस्करण 4.0 के अनुसार, ग्रैडल अब एक स्रोत सेट में प्रत्येक भाषा के लिए अलग-अलग कक्षाओं निर्देशिकाओं का उपयोग करता है। इसलिए यदि आपकी बिल्ड स्क्रिप्ट का उपयोग किया जाता है sourceSets.integrationTest.output.classesDir, तो आपको निम्न पदावनति चेतावनी दिखाई देगी।

ग्रैडल अब प्रत्येक जेवीएम भाषा के लिए अलग-अलग आउटपुट निर्देशिकाओं का उपयोग करता है, लेकिन यह एक स्रोत सेट से सभी वर्गों के लिए एकल निर्देशिका मान लेता है। यह व्यवहार पदावनत कर दिया गया है और ग्रैडल 5.0 में हटा दिया जाना तय है

इस चेतावनी से छुटकारा पाने के लिए, sourceSets.integrationTest.output.classesDirsइसके बजाय बस स्विच करें । अधिक जानकारी के लिए, ग्रेडल 4.0 रिलीज़ नोट देखें


<hmm> पर स्विच करें ?? आपके पहले और बाद में भी वही हैं।
मर्क

0

मैं ग्रेडल 6.0.1 JUnit 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अनुभाग निर्दिष्ट करना पड़ा , मुझे संदेह है कि सबसे अच्छा / एकमात्र तरीका है।

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