TestKit 简介:用于功能性测试 Gradle 构建逻辑的工具包

目录

  • 使用 TestKit
  • 详细了解 TestKit
  • TestKit 的路线图是什么?
  • 简介

    自动化测试是启用软件开发实践(例如重构、持续集成和交付)的必要先决条件。虽然为应用程序代码编写单元测试、集成测试和功能测试已成为行业规范,但可以公平地说,构建自动化领域的测试尚未成为主流。

    但为什么我们不对构建逻辑应用相同的成熟测试实践呢?最终,构建逻辑与应用程序代码一样重要。它帮助我们以自动化、可重现和可靠的方式向客户交付生产软件。可能有许多理由跳过测试;然而,突出的原因之一是用于制定构建逻辑的数据定义格式。过去,如果没有合适的工具,为基于 XML 的构建逻辑定义编写测试是一项艰巨的,几乎不可能完成的任务。

    在这方面,Gradle 让您的生活更轻松。借助自定义任务二进制插件等概念,可以正确地构建构建代码,根据功能边界进行组织,并作为实际的类实现进行开发。构建逻辑的自动化测试变得平易近人,并且与适当的工具结合使用时,可以轻松实现。

    认识 TestKit #

    测试构建逻辑的一种方法是以最终用户相同的方式声明和执行它。实际上,这意味着创建一个构建脚本,添加您要测试的配置,并使用 Gradle 运行时执行它。可以检查构建的结果,例如控制台输出、执行的任务和生成的文件,并根据预期的断言进行验证。这种类型的测试通常称为功能测试。

    让我们看一个例子。在以下构建脚本中,我们应用 Java 插件。

    build.gradle #

    apply plugin: 'java'
    

    使用 compileJava 任务执行此构建脚本应为在目录 src/main/java 中找到的 Java 源文件生成类文件。作为最终用户,我们期望这些类文件位于目录 build/classes/main 中。当然,您可以通过使用 Gradle 命令手动执行给定的构建脚本并检查输出目录来验证此行为。我希望最后一句话让您感到痒痒。我们是自动化工程师,所以显然我们希望尽可能多地自动化。

    认识 Gradle TestKit:一个用于以自动化方式执行功能测试的工具包。TestKit 与 Gradle 捆绑在一起,从 2.6 版本开始,现在可以在您的项目中使用。

    使用 TestKit #

    通常有两种不同的用例将 TestKit 添加到项目中。

    1. 跨版本兼容性测试。您想验证构建脚本是否与特定 Gradle 版本兼容。组织经常应用此技术来准备现有构建的 Gradle 版本升级,或者当同一构建逻辑必须支持多个 Gradle 版本时。

    2. 自定义构建逻辑测试。您想测试您的自定义任务或插件在某些条件下(类似于构建脚本作者的实际使用情况)是否按预期运行。一个典型的例子可能是:“如果用户应用此插件并配置了我公开扩展的属性,那么提供的任务应观察到特定的运行时行为,并在执行时生成输出 x。” 除此之外,跨版本兼容性也可能发挥作用。

    鉴于最后一个示例,让我们看看如何使用 TestKit API 实现该场景。请注意,以下测试类使用 Spock 测试框架

    BuildLogicFunctionalTest.groovy #

    import org.gradle.testkit.runner.GradleRunner
    import static org.gradle.testkit.runner.TaskOutcome.*
    import org.junit.Rule
    import org.junit.rules.TemporaryFolder
    import spock.lang.Specification
    
    class BuildLogicFunctionalTest extends Specification {
       @Rule final TemporaryFolder testProjectDir = new TemporaryFolder()
       File buildFile
    
       def setup() {
           buildFile = testProjectDir.newFile('build.gradle')
       }
    
       def 'produces class files when compiling Java source code'() {
           given:
           buildFile << "apply plugin: 'java'"
    
           when:
           def result = GradleRunner.create()
               .withProjectDir(testProjectDir.root)
              .withArguments('compileJava')
              .build()
    
           then:
           result.task(':compileJava').outcome == SUCCESS
           new File(testProjectDir.root, 'build/classes/main').exists()
       }
    }
    

    即使您以前从未使用过 Groovy 或 Spock,也很明显使用 TestKit 创建功能测试用例是多么容易。

    详细了解 TestKit #

    之前的代码示例使用 Spock 来实现测试用例。如果您不熟悉 Spock 或更喜欢其他测试框架,您仍然可以使用 TestKit。根据设计,TestKit 与测试框架无关。您可以选择您最喜欢的测试框架,无论是 JUnitTestNG 还是其他任何测试框架。

    对于需要您使用多个 Gradle 发行版执行测试的测试场景,例如在跨版本兼容性测试的上下文中,TestKit 公开了 API 方法,用于提供适当的 Gradle 发行版信息。您可以指向 Gradle 的本地安装、由 Gradle Inc. 托管的服务器上由版本标识的发行版或由 URI 标识的发行版。

    当您执行测试时,您可能还希望从您选择的 IDE 中单步执行正在测试的构建逻辑以进行调试。TestKit 允许您在调试模式下执行测试,以跟踪意外的测试运行时行为。

    TestKit 的路线图是什么? #

    TestKit 还有更多功能即将推出。未来,我们希望使 TestKit API 的使用更加方便。您可以在设计文档中阅读所有相关信息。如果您有兴趣贡献力量,请告诉我们!我们很乐意看到 TestKit 不断发展。

    讨论