2011-11-08 82 views
15

哪些測試Gradle腳本的最佳實踐?指南測試腳本搖籃

我目前單元antunit測試我ant劇本,但我正在尋找遷移到搖籃。我只能從Gradle或Groovy中找到有關測試Java代碼的文章,但沒有詳細測試我創建或測試Groovy的Gradle任務。 Gradle有沒有相當於antunit的?有沒有人玩過BDD框架(如cucumber)來測試Gradle腳本?

舉例來說,我現在有以下Ant目標

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

這是由下面的代碼片段叫交出了漂亮的XML報告

   <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到搖籃,但我不知道什麼是遷移test-dist-bin正確的方式和撥打au:antunit

回答

2

搖籃3.x的測試工具包中! 請看看這裏userguide:https://docs.gradle.org/current/userguide/test_kit.html

邏輯的正確性,然後可通過發出以下驗證,可能的組合:

  • 構建的輸出;
  • 構建的日誌記錄(即,控制檯輸出);
  • 該組由構建及其結果執行的任務(例如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之下,則無需額外配置即可運行它們。例如,Spock的BDD測試也是如此。如果您想了解更多關於Gradle的測試功能的信息,請查看書籍Building and Testing with Gradle。它涵蓋了使用JUnit,TestNG,Spock,Geb和EasyB進行測試。

5

我認爲湯姆的意思是測試自己的gradle編寫任務的方式,對不對?如果您通過擴展DefaultTask編寫了自定義Gradle任務,並將其放入項目的buildSrc文件夾中,則可以添加一個junit/spock /基於任何測試類來測試您的任務實現。 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

要斷言添加到您的構建腳本「即席任務」像你上面的例子,你可以使用常規電源斷言。

一個例子: 如果你在你的腳本AA非常簡單的任務是這樣的:

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

您可以修改任務本身添加一個斷言:

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

或添加一個專門的測試任務給你的腳本

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

記得喲您可以在構建腳本中使用groovy語言的全部功能。

有計劃有一個gradle這個集成測試工具包,以支持測試他們的自定義生成邏輯構建腳本作者。看看:

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

+0

沒有延長DefaultTask,只是一個普通的老搖籃任務(這螞蟻是指爲目標)。上面添加的例子。 –

+0

我已經更新了我的答案顯示在您的構建腳本 –

+0

嘆息使用斷言的一個例子。謝謝你的答案和更新舉個例子,但是如果斷言都存在,那麼我必須說我有點失望。 –