ग्रैडल टेस्ट डिपेंडेंसी


81

मेरे पास दो परियोजनाएं हैं, प्रोजेक्ट ए और प्रोजेक्ट बी। दोनों ग्रूवी में लिखे गए हैं और उनके निर्माण प्रणाली के रूप में ग्रेडेल का उपयोग करते हैं।

प्रोजेक्ट A को प्रोजेक्ट B की आवश्यकता है। यह संकलन और परीक्षण कोड दोनों के लिए है।

मैं कैसे कॉन्फ़िगर कर सकता हूं कि प्रोजेक्ट ए के परीक्षण वर्गों के पास प्रोजेक्ट बी के परीक्षण वर्गों तक पहुंच है?


जवाबों:


106

आप 'परीक्षण' कॉन्फ़िगरेशन के माध्यम से परीक्षण कक्षाओं को उजागर कर सकते हैं और फिर उस कॉन्फ़िगरेशन पर एक परीक्षणकंप्ली निर्भरता को परिभाषित कर सकते हैं।

मेरे पास सभी जावा प्रोजेक्ट्स के लिए यह ब्लॉक है, जो सभी टेस्ट कोड को जार करता है:

task testJar(type: Jar, dependsOn: testClasses) {
    baseName = "test-${project.archivesBaseName}"
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testJar
}

फिर जब मेरे पास परीक्षण कोड होता है तो मैं उन परियोजनाओं के बीच पहुंचना चाहता हूं जो मैं उपयोग करता हूं

dependencies {
    testCompile project(path: ':aProject', configuration: 'tests')
}

यह जावा के लिए है; मैं मान रहा हूं कि इसे ग्रूवी के लिए भी काम करना चाहिए।


1
अगर मुझे आपका प्रश्न समझ में आता है, तो हाँ, जहाँ तक मुझे पता है कि आपको परीक्षण कक्षाओं को उन्हें निर्भरता के रूप में उपयोग करने के लिए संकलित करने की आवश्यकता होगी।
डेविड रेसनिक

1
ग्रैडल के बाद के संस्करणों के लिए (मैं 1.3 का उपयोग कर रहा हूं) लाइन "sourceSets.test.classes" से "sourceSets.test.output" से पढ़ना चाहिए
बेन

2
परीक्षणों के सभी सकरात्मक निर्भरता में भी खींचने के लिए, मैंने कहा: configurations { tests { extendsFrom testRuntime } }
रेमन

3
AndroidTest वर्गों के लिए समान कैसे प्राप्त करें?
एक्स-हुमन

3
मेरे लिए काम नहीं कर रहा है, हमेशा मिलता है -Could not get unknown property 'testClasses'
pavle

17

यह एक सरल उपाय है जिसे मध्यवर्ती जार फ़ाइल की आवश्यकता नहीं है:

dependencies {
  ...
  testCompile project(':aProject').sourceSets.test.output
}

इस प्रश्न में अधिक चर्चा है: बहु-परियोजना परीक्षण निर्भरता


7
यह आईडीई एकीकरण को तोड़ता है और सकर्मक निर्भरता को याद करता है। यह परियोजनाओं के इनकैप्सुलेशन को भी तोड़ता है, जो हमेशा एक बुरा अभ्यास है।
स्टीफन ओहीमे

8

यह मेरे लिए काम करता है (जावा)

// use test classes from spring-common as dependency to tests of current module
testCompile files(this.project(':spring-common').sourceSets.test.output)
testCompile files(this.project(':spring-common').sourceSets.test.runtimeClasspath)

// filter dublicated dependency for IDEA export
def isClassesDependency(module) {
     (module instanceof org.gradle.plugins.ide.idea.model.ModuleLibrary) && module.classes.iterator()[0].url.toString().contains(rootProject.name)
}

idea {
      module {
          iml.whenMerged { module ->
              module.dependencies.removeAll(module.dependencies.grep{isClassesDependency(it)})
              module.dependencies*.exported = true
          }
      }
  }
.....  
// and somewhere to include test classes 
testRuntime project(":spring-common")

5

उपरोक्त समाधान काम करता है, लेकिन 1.0-rc3ग्रेडेल के नवीनतम संस्करण के लिए नहीं ।

     task testJar(type: Jar, dependsOn: testClasses) {
       baseName = "test-${project.archivesBaseName}"

       // in the latest version of Gradle 1.0-rc3
       // sourceSets.test.classes no longer works
       // It has been replaced with 
       // sourceSets.test.output

       from sourceSets.test.output
     }

5

यदि ProjectA में वह परीक्षण कोड है जिसे आप ProjectB में उपयोग करना चाहते हैं और ProjectB परीक्षण कोड को शामिल करने के लिए कलाकृतियों का उपयोग करना चाहता है , तो ProjectB का build.gradle इस तरह दिखेगा:

dependencies {

  testCompile("com.example:projecta:1.0.0-SNAPSHOT:tests")

}

तब आपको ProjectA के build.gradle में अनुभाग में एक archivesकमांड जोड़ने artifactsकी आवश्यकता है:

task testsJar(type: Jar, dependsOn: testClasses) {
    classifier = 'tests'
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testsJar
    archives testsJar
}

jar.finalizedBy(testsJar)

अब जब ProjectA की कलाकृतियों को आपकी कलाकृतियों में प्रकाशित किया जाता है, तो वे एक- टट्टी जार शामिल करेंगी । यह -tests जार तब ProjectB (जैसा कि ऊपर दिखाया गया है) के लिए testCompile निर्भरता के रूप में जोड़ा जा सकता है।



0

एंड्रॉइड के नवीनतम ग्रेडेल संस्करण पर (मैं वर्तमान में 2.14.1 पर हूं) आपको प्रोजेक्ट ए से सभी परीक्षण निर्भरता प्राप्त करने के लिए प्रोजेक्ट बी में नीचे जोड़ने की आवश्यकता है।

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.