2011-11-08 10 views
15

Các phương pháp hay nhất để thử nghiệm Gradle Kịch bản là gì?Hướng dẫn để Thử nghiệm Kịch bản Gradle

Tôi hiện đang kiểm tra đơn vị của mình ant tập lệnh với antunit, nhưng tôi đang tìm cách di chuyển sang Gradle. Tôi chỉ có thể tìm thấy các bài viết về kiểm tra mã Java từ Gradle hoặc Groovy, nhưng không có gì để thử nghiệm các nhiệm vụ Gradle mà tôi tạo ra hoặc thử nghiệm Groovy nói chung. Có tương đương với antunit cho Gradle không? Có ai chơi với một khuôn khổ BDD (như cucumber) để kiểm tra kịch bản Gradle?

Ví dụ, tôi hiện đang có Ant Target sau

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

Như bạn có thể tưởng tượng, đó là khá dễ dàng để phá vỡ này khi refactoring dự án, vì vậy tôi có những điều sau antunit thử nghiệm để kiểm tra xem nó.

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

được gọi bằng đoạn mã sau đây để tạo ra một báo cáo xml đẹp

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

Tôi hiểu làm thế nào để di chuyển dist-bin để gradle, nhưng tôi không chắc chắn đúng cách để di chuyển test-dist-bin là những gì và cuộc gọi au:antunit.

Trả lời

2

Kiểm tra tốt nghiệp 3.x Bộ công cụ có sẵn! Xin vui lòng, kiểm tra userguide đây: https://docs.gradle.org/current/userguide/test_kit.html

Sự đúng đắn của logic sau đó có thể được xác nhận bằng cách khẳng định những điều sau đây, có khả năng kết hợp:

  • của xây dựng đầu ra;
  • Ghi nhật ký của bản dựng (ví dụ: đầu ra của bảng điều khiển);
  • Tập hợp các tác vụ được thực hiện bởi bản dựng và kết quả của chúng (ví dụ: FAILED, UP-TO-DATE, v.v.).

copy-dán dụ:

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

Miễn là bạn áp dụng plugin groovy và các thử nghiệm của bạn nằm dưới src/test/groovy, không cần cấu hình bổ sung để chạy chúng. Điều tương tự cũng đúng đối với các thử nghiệm BDD với Spock chẳng hạn. Nếu bạn muốn đọc thêm về khả năng kiểm tra của Gradle, hãy xem cuốn sách Building and Testing with Gradle. Nó bao gồm thử nghiệm với JUnit, TestNG, Spock, Geb và EasyB.

5

Tôi nghĩ những gì tom có ​​nghĩa là một cách để kiểm tra nhiệm vụ của mình bằng văn bản gradle, phải không? Nếu bạn đã viết một nhiệm vụ gradle tùy chỉnh bằng cách mở rộng DefaultTask và bạn đặt nó trong thư mục buildSrc của dự án của bạn, bạn có thể thêm một lớp kiểm tra junit/spock/bất cứ điều gì dựa trên để kiểm tra việc thực hiện nhiệm vụ của bạn. Gradles xây dựng riêng cung cấp một ví dụ tốt cho điều đó. có một cái nhìn tại

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

Đây là một đặc điểm kỹ thuật Spock, mà kiểm tra các ExtractDslMetaDataTask được viết riêng cho Sàng riêng xây dựng. Các ExtractDslMetaDataTask tọa lạc tại địa chỉ:

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

Để thêm khẳng định để xây dựng kịch bản "nhiệm vụ Adhoc" của bạn giống như ví dụ của bạn ở trên, bạn có thể sử dụng sự khẳng định sức mạnh groovy.

một ví dụ: nếu bạn có aa nhiệm vụ rất đơn giản như thế này trong kịch bản của bạn:

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

bạn có thể sửa đổi nhiệm vụ riêng của mình để thêm một khẳng định:

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

hoặc bạn thêm một nhiệm vụ kiểm tra chuyên dụng cho tập lệnh của bạn

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

hãy nhớ rằng yo u có thể sử dụng toàn bộ sức mạnh của ngôn ngữ groovy trong các kịch bản xây dựng của bạn.

Có các kế hoạch để có bộ công cụ kiểm tra tích hợp ở mức độ cao để hỗ trợ các tác giả xây dựng kịch bản thử nghiệm logic xây dựng tùy chỉnh của họ. hãy xem:

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

+0

Không mở rộng DefaultTask, chỉ là một nhiệm vụ Gradle cũ đồng bằng (mà Ant gọi là mục tiêu). Ví dụ được thêm ở trên. –

+0

Tôi đã cập nhật câu trả lời của mình để hiển thị ví dụ về việc sử dụng xác nhận trong tập lệnh xây dựng của bạn –

+0

Sigh. Cảm ơn câu trả lời và cập nhật với một ví dụ, nhưng nếu khẳng định là tất cả, thì tôi phải nói rằng tôi hơi thất vọng một chút. –