2011-11-08 12 views
15

Gradle स्क्रिप्ट्स का परीक्षण करने के लिए सर्वोत्तम प्रथाएं क्या हैं?परीक्षण ग्रैडल स्क्रिप्ट्स के लिए मार्गदर्शिका

मैं वर्तमान में स्क्रिप्ट्स antunit के साथ परीक्षण करता हूं, लेकिन मैं ग्रैडल में माइग्रेट करना चाहता हूं। मैं केवल ग्राडल या ग्रोवी से जावा कोड का परीक्षण करने के लिए लेख ढूंढ सकता हूं, लेकिन सामान्य रूप से ग्रोवी बनाने या परीक्षण करने वाले ग्रैडल कार्यों का परीक्षण करने के लिए कुछ भी नहीं। क्या ग्रैडल के लिए एंटीनीट के बराबर है? क्या किसी ने बीडीडी ढांचे के साथ खेला है (जैसे cucumber) ग्रैडल स्क्रिप्ट का परीक्षण करने के लिए?

उदाहरण के लिए, मैं वर्तमान में निम्नलिखित चींटी लक्ष्य

<target name="dist-bin" depends="build" description="creates a zip distribution of the current build"> 
    <zip destfile="build/TIBant-bin.zip"> 
     <zipfileset dir="src/ant" includes="**" /> 
     <zipfileset dir="test" includes="**" prefix="test" /> 
     <zipfileset dir="build" includes="TIBant.jar" /> 
     <zipfileset dir="build" includes="TIBant-*.html" /> 
     <zipfileset dir="build/examples/XMLtoProperties" 
        includes="XMLtoProperties.html" 
        prefix="examples/XMLtoProperties" /> 
     <zipfileset dir="lib" includes="**" prefix="lib" /> 
     <zipfileset dir="src/xslt" includes="**" excludes="test/**,userguide.xslt" prefix="lib/xslt" /> 
     <zipfileset dir="." includes="copyright.html,LICENSE.txt" /> 
     <zipfileset dir="examples" 
        includes="**" 
        excludes="**/build/**,**/config/default.properties" 
        prefix="examples" /> 
    </zip> 
</target> 

आप कल्पना कर सकते हैं, यह बहुत जब परियोजना पुनर्रचना इस तोड़ने के लिए आसान है है, तो मैं इसे की जाँच करने के antunit परीक्षण निम्नलिखित है।

<target name="test-dist-bin"> 
    <delete file="build/TIBant-bin.zip" /> 
    <au:assertFalse message="Bin dist still present"> 
     <available file="build/TIBant-bin.zip" /> 
    </au:assertFalse> 
    <antcall target="dist-bin" /> 
    <au:assertTrue message="Bin dist not created"> 
     <available file="build/TIBant-bin.zip" /> 
    </au:assertTrue> 
    <delete dir="build/testBinDist" /> 
    <au:assertFalse message="TestBinDist still present"> 
     <available file="build/testBinDist" /> 
    </au:assertFalse> 
    <mkdir dir="build/testBinDist" /> 
    <unzip src="build/TIBant-bin.zip" dest="build/testBinDist" /> 
    <au:assertFalse message="config dir present"> 
     <available file="build/testBinDist/config/default.properties" /> 
    </au:assertFalse> 
    <au:assertTrue message="Ant Macros missing"> 
     <available file="build/testBinDist/tibant.xml" /> 
    </au:assertTrue> 
    <au:assertTrue message="Engine Stopper Jar missing"> 
     <available file="build/testBinDist/TIBant.jar" /> 
    </au:assertTrue> 
    <au:assertTrue message="Ant-contrib-missing"> 
     <available file="build/testBinDist/lib/ant-contrib-1.0b3.jar" /> 
    </au:assertTrue> 
    <au:assertTrue message="ant-unit missing"> 
     <available file="build/testBinDist/lib/ant-antunit-1.2.jar" /> 
    </au:assertTrue> 
    <au:assertTrue message="Copyright missing"> 
     <available file="build/testBinDist/copyright.html" /> 
    </au:assertTrue> 
    <au:assertTrue message="License missing"> 
     <available file="build/testBinDist/LICENSE.txt" /> 
    </au:assertTrue> 
    <au:assertFalse message="Src present"> 
     <available file="build/testBinDist/src/java/org/windyroad/tibant/EngineStopper.jar" /> 
    </au:assertFalse> 
    <au:assertTrue message="example missing"> 
     <available file="build/testBinDist/examples/SimpleProject/src/bw/example/Build/example.archive" /> 
    </au:assertTrue> 
    <au:assertFalse message="example has build files"> 
     <available file="build/testBinDist/examples/SimpleProject/build/*" /> 
    </au:assertFalse> 
    <au:assertFalse message="example has default config file"> 
     <available file="build/testBinDist/examples/SimpleProject/config/default.properties" /> 
    </au:assertFalse> 
    <property name="doc.file" 
       location="build/testBinDist/TIBant-User-Guide.html" /> 
    <au:assertTrue message="doc missing: ${doc.file}"> 
     <available file="${doc.file}" /> 
    </au:assertTrue> 
    <au:assertTrue message="xslt missing"> 
     <available file="build/testBinDist/lib/xslt/configure-ear.xslt" /> 
    </au:assertTrue> 
    <subant target="run-quick-tests"> 
     <fileset dir="build/testBinDist" includes="build.xml" /> 
    </subant> 
</target> 

जो यह स्निपेट द्वारा कहा जाता है एक अच्छा एक्सएमएल रिपोर्ट

   <au:antunit failonerror="@{failonerror}"> 
        <propertyset> 
         <propertyref name="config.filename" /> 
        </propertyset> 
        <path> 
         <pathelement location="@{antunit}" /> 
        </path> 
        <au:plainlistener logLevel="info" /> 
        <au:xmllistener todir="build" loglevel="info" /> 
       </au:antunit> 

मैं समझता हूँ dist-bin माइग्रेट करने का तरीका Gradle के निर्माण करने के लिए है, लेकिन मुझे यकीन है कि क्या test-dist-bin विस्थापित करने के लिए सही तरीका है नहीं कर रहा हूँ और au:antunit कॉल।

उत्तर

2

Gradle 3.x परीक्षण टूलकिट उपलब्ध: पर एक नजर है! https://docs.gradle.org/current/userguide/test_kit.html

तर्क की सत्यता तो संभवतः संयोजन में, निम्नलिखित जोर देते हुए द्वारा सत्यापित किया जा सकता: कृपया, बाहर userguide यहाँ जाँच

  • निर्माण के उत्पादन;
  • बिल्ड का लॉगिंग (यानी कंसोल आउटपुट);
  • बिल्ड और उनके परिणामों द्वारा निष्पादित कार्यों का सेट (उदा। FAILED, UP-TO-DATE आदि)।

प्रतिलिपि चिपकाया उदाहरण:

import org.gradle.testkit.runner.BuildResult; 
import org.gradle.testkit.runner.GradleRunner; 
import org.junit.Before; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.TemporaryFolder; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.Collections; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertTrue; 

import static org.gradle.testkit.runner.TaskOutcome.*; 

public class BuildLogicFunctionalTest { 
    @Rule public final TemporaryFolder testProjectDir = new TemporaryFolder(); 
    private File buildFile; 

    @Before 
    public void setup() throws IOException { 
     buildFile = testProjectDir.newFile("build.gradle"); 
    } 

    @Test 
    public void testHelloWorldTask() throws IOException { 
     String buildFileContent = "task helloWorld {" + 
            " doLast {" + 
            "  println 'Hello world!'" + 
            " }" + 
            "}"; 
     writeFile(buildFile, buildFileContent); 

     BuildResult result = GradleRunner.create() 
      .withProjectDir(testProjectDir.getRoot()) 
      .withArguments("helloWorld") 
      .build(); 

     assertTrue(result.getOutput().contains("Hello world!")); 
     assertEquals(result.task(":helloWorld").getOutcome(), SUCCESS); 
    } 

    private void writeFile(File destination, String content) throws IOException { 
     BufferedWriter output = null; 
     try { 
      output = new BufferedWriter(new FileWriter(destination)); 
      output.write(content); 
     } finally { 
      if (output != null) { 
       output.close(); 
      } 
     } 
    } 
} 
3

जब तक आप प्लगइन groovy प्लगइन लागू करते हैं और आपके परीक्षण src/test/groovy के अंतर्गत बैठते हैं तो उन्हें चलाने के लिए कोई अतिरिक्त कॉन्फ़िगरेशन आवश्यक नहीं है। उदाहरण के लिए स्पॉक के साथ बीडीडी परीक्षणों के लिए भी यही सच है। यदि आप ग्रैडल की परीक्षण क्षमताओं के बारे में अधिक पढ़ना चाहते हैं तो Building and Testing with Gradle पुस्तक देखें। इसमें जुनीट, टेस्टएनजी, स्पॉक, गेब और ईज़ीबी के साथ परीक्षण शामिल है।

5

मुझे लगता है कि टॉम का अर्थ क्या है अपने लिखित स्नातक कार्यों का परीक्षण करने का एक तरीका है, है ना? यदि आपने डिफॉल्टटास्क को विस्तारित करके एक कस्टम ग्रेडल कार्य लिखा है और आपने इसे अपने प्रोजेक्ट के buildSrc फ़ोल्डर में रखा है, तो आप अपने कार्य कार्यान्वयन का परीक्षण करने के लिए एक जूनिट/स्पॉक/जो भी आधारित टेस्ट क्लास जोड़ सकते हैं। Gradles अपने निर्माण के लिए एक अच्छा उदाहरण प्रदान करता है।

https://github.com/gradle/gradle/blob/master/buildSrc/src/test/groovy/org/gradle/build/docs/dsl/source/ExtractDslMetaDataTaskTest.groovy

यह एक स्पॉक विनिर्देश, कि ExtractDslMetaDataTask जो विशेष रूप से ग्रिडल्स खुद निर्माण के लिए लिखा गया था परीक्षण है पर एक नजर है। ExtractDslMetaDataTask पर स्थित है:

https://github.com/gradle/gradle/blob/master/buildSrc/src/main/groovy/org/gradle/build/docs/dsl/source/ExtractDslMetaDataTask.groovy

अपने उदाहरण की तरह अपने निर्माण स्क्रिप्ट "सहारा कार्य" करने के लिए दावे को जोड़ने के लिए ऊपर आप ग्रूवी बिजली अभिकथन उपयोग कर सकते हैं।

एक उदाहरण: आप अपनी स्क्रिप्ट में इस तरह आ बहुत ही सरल कार्य है, तो:

task writeFoo << { 
    file("$buildDir/foo.txt").text = "bar" 
    assert file("$buildDir/foo.txt).isFile() 
} 

या आप जोड़ना:

task writeFoo << { 
    file("$buildDir/foo.txt").text = "bar" 
} 

आप एक अभिकथन को जोड़ने के लिए काम ही संशोधित कर सकते हैं या तो आपकी स्क्रिप्ट

task testWriteFoo(dependsOn: writeFoo) << { 
    assert file("$buildDir/foo.txt).isFile() 
    assert file("$buildDir/foo.txt).text == "bar" 
} 

याद रखें कि यो आप अपनी बिल्ड स्क्रिप्ट में ग्रोवी भाषा की पूरी शक्ति का उपयोग कर सकते हैं।

बिल्ड कस्टम स्क्रिप्ट तर्कों का परीक्षण करने के लिए बिल्ड स्क्रिप्ट लेखकों का समर्थन करने के लिए क्रम में एक एकीकृत परीक्षण टूलकिट रखने की योजना है।

http://forums.gradle.org/gradle/topics/testing_toolkit_for_custom_build_logic

+0

कोई विस्तार DefaultTask, बस एक सादे पुराने Gradle काम (जो चींटी लक्ष्य के रूप में करने के लिए संदर्भित करता है)। उदाहरण ऊपर जोड़ा गया। –

+0

मैंने अपनी बिल्ड स्क्रिप्ट –

+0

Sigh में दावाों का उपयोग करने का एक उदाहरण दिखाने के लिए अपना उत्तर अपडेट किया है। एक उदाहरण के साथ उत्तर और अद्यतन के लिए धन्यवाद, लेकिन यदि सभी कहते हैं, तो मुझे कहना होगा कि मैं थोड़ा निराश हूं। –

संबंधित मुद्दे