unit-testing - Gradle 脚本测试指南

标签 unit-testing testing bdd gradle

测试的最佳实践是什么 Gradle脚本?

我目前对我的 ant 进行单元测试带有 antunit 的脚本,但我希望迁移到 Gradle。我只能找到关于从 Gradle 或 Groovy 测试 Java 代码的文章,但找不到关于测试我创建的 Gradle 任务或一般测试 Groovy 的文章。 Gradle 是否有等效的 antunit?是否有人使用 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>

正如您所想象的,在重构项目时很容易打破这一点,所以我有以下 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 迁移到 gradle,但我不确定迁移 test-dist-bin 的正确方法是什么au:antunit 调用。

最佳答案

我想tom的意思是一种测试他自己写的gradle任务的方法吧?如果您通过扩展 DefaultTask 编写了自定义 gradle 任务并将其放在项目的 buildSrc 文件夹中,则可以添加一个基于 junit/spock/whatever 的测试类来测试您的任务实现。 Gradles 自己的构建为此提供了一个很好的例子。看看

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

这是一个 spock 规范,用于测试 ExtractDslMetaDataTask,它是专门为 griddles 自己的构建编写的。 ExtractDslMetaDataTask 位于:

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

要像上面的示例一样向您的构建脚本“临时任务”添加断言,您可以使用 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 语言的全部功能。

我们计划在 gradle 中集成一个测试工具包,以支持构建脚本作者测试他们的自定义构建逻辑。看看:

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

关于unit-testing - Gradle 脚本测试指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8045292/

相关文章:

python - 使用pytest教程出错

cucumber - SpecFlow vs Cuke4Nuke vs Cucumber+IR

testing - 如何解决所有“hook : prepare suite:"之前的错误 ""”

testing - react native : How to setup automated integration tests?

javascript - 使用 React.js 进行 TDD/BDD?

c# - 几种方法的 BDD 命名

java - 错误 : javax. persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey 与 Spring Controller

unit-testing - Terratest - 使用模拟 AWS 服务

.net - 如何对 winforms 应用程序进行单元测试

python - 异常引发不会反射(reflect)在测试用例中,即使在日志中看到异常引发