Руководство по тестированию скриптов Gradle - PullRequest
15 голосов
/ 08 ноября 2011

Каковы лучшие практики для тестирования Gradle Сценариев?

В настоящее время я тестирую мои ant сценарии с antunit , но я 'ищу мигрировать в Gradle.Я могу найти только статьи о тестировании кода Java из Gradle или Groovy, но ничего о тестировании задач Gradle, которые я создаю, или тестировании Groovy в целом.Есть ли эквивалент Грейдла для блока?Кто-нибудь играл с каркасом BDD (например, cucumber ) для тестирования скриптов Gradle?

Например, у меня в настоящее время есть следующая Ant Target

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

Как вы можетепредставьте себе, это довольно легко сломать при рефакторинге проекта, поэтому у меня есть следующий тестовый блок для его проверки:

<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 в gradle, но я не уверен, как правильно перенести test-dist-bin и au:antunit call.

Ответы [ 3 ]

5 голосов
/ 08 ноября 2011

Я думаю, что Том имел в виду способ проверить свои собственные письменные задания, верно?Если вы написали пользовательскую задачу gradle, расширив DefaultTask, и поместили ее в папку buildSrc вашего проекта, вы можете добавить тестовый класс на основе junit / spock / what для тестирования вашей реализации задачи.Собственная сборка Gradles является хорошим примером для этого.взгляните на

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

Это спецификация спока, которая проверяет ExtractDslMetaDataTask, который был специально написан для собственной сборки griddles.ExtractDslMetaDataTask находится по адресу:

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

Чтобы добавить утверждения к вашему сценарию сборки "adhoc tasks", как в примере выше, вы можете использовать Groovy Power Assertion.

пример: если у вас в скрипте очень простая задача, подобная этой:

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 в своих сценариях сборки.

В планах имеется интегрированный инструментарий тестирования дляПоддержка авторов сценариев сборки при тестировании их собственной логики сборки.взгляните на:

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

3 голосов
/ 08 ноября 2011

Пока вы применяете плагин groovy и ваши тесты находятся под src/test/groovy, для их запуска не требуется никаких дополнительных настроек.То же самое верно для тестов BDD со Споком, например.Если вы хотите узнать больше о возможностях тестирования Gradle, ознакомьтесь с книгой Создание и тестирование с Gradle .Он охватывает тестирование с использованием JUnit, TestNG, Spock, Geb и EasyB.

2 голосов
/ 23 сентября 2016

Доступен тестовый набор Gradle 3.x!Пожалуйста, ознакомьтесь с руководством пользователя здесь: https://docs.gradle.org/current/userguide/test_kit.html

Правильность логики можно проверить, утверждая следующее, возможно в комбинации:

  • Выход сборки;
  • Ведение журнала сборки (т. Е. Вывод консоли);
  • Набор задач, выполняемых сборкой, и их результаты (например, СБОЙ, ОБНОВЛЕНИЕ и т. Д.).

скопированный пример:

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();
            }
        }
    }
}
...