介绍 TestKit:用于功能测试 Gradle 构建逻辑的工具包
自动化测试是实现重构、持续集成和交付等软件开发实践的必要先决条件。虽然为应用程序代码编写单元测试、集成测试和功能测试已成为行业规范,但可以公平地说,构建自动化领域的测试尚未成为主流。
但为什么我们不将相同的测试实践应用于构建逻辑呢?最终,构建逻辑与应用程序代码一样重要。它帮助我们以自动化、可重复和可靠的方式将生产软件交付给客户。可能有很多理由跳过测试;但是,其中一个突出的原因是用于制定构建逻辑的数据定义格式。过去,在没有合适的工具的情况下,为基于 XML 的构建逻辑定义编写测试是一项艰巨的任务,几乎不可能完成。
在这方面,Gradle 使您的生活更轻松。借助 自定义任务 和 二进制插件 等概念,构建代码可以结构合理,基于功能边界进行组织,并作为实际的类实现进行开发。构建逻辑的自动化测试变得易于实现,并且与适当的工具相结合后,很容易实现。
认识 TestKit
测试构建逻辑的一种方法是像最终用户一样声明和执行它。在实践中,这意味着创建一个构建脚本,添加要测试的配置,并使用 Gradle 运行时执行它。构建的结果,例如控制台输出、执行的任务和生成的工件,可以进行检查并根据预期断言进行验证。这种类型的测试通常被称为功能测试。
让我们看一个例子。在下面的构建脚本中,我们应用了 Java 插件。
build.gradle
apply plugin: 'java'
使用 compileJava
任务执行此构建脚本应该为在 src/main/java
目录中找到的 Java 源文件生成类文件。作为最终用户,我们希望这些类文件位于 build/classes/main
目录中。当然,您可以通过使用 Gradle 命令手动执行给定的构建脚本并检查输出目录来验证此行为。我希望最后一句话让你感到痒痒。我们是自动化工程师,所以很明显,我们希望尽可能地自动化。
认识 Gradle TestKit:一个用于以自动化方式执行功能测试的工具包。TestKit 从版本 2.6 开始与 Gradle 捆绑在一起,现在可以在您的项目中使用。
使用 TestKit
将 TestKit 添加到项目中通常有两种不同的用例。
-
跨版本兼容性测试。您想验证构建脚本是否与特定 Gradle 版本兼容。组织通常在准备现有构建的 Gradle 版本升级或当同一构建逻辑必须支持多个版本的 Gradle 时应用此技术。
-
自定义构建逻辑测试。您想测试您的自定义任务或插件在类似于构建脚本作者实际使用情况的某些条件下是否按预期运行。一个典型的例子可能是:“如果用户应用此插件并配置我公开扩展的属性,那么提供的任务应该观察到特定的运行时行为,并在执行时生成输出 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 与测试框架无关。您可以选择最适合您的测试框架,无论是 JUnit、TestNG 还是其他任何测试框架。
对于需要使用多个 Gradle 发行版执行测试的测试场景,例如在跨版本兼容性测试的上下文中,TestKit 公开了 API 方法 来提供适当的 Gradle 发行版信息。您可以指向 Gradle 的本地安装、由 Gradle Inc. 托管的服务器上按版本标识的发行版或可通过 URI 标识的发行版。
在执行测试时,您可能还想从您选择的 IDE 中逐步调试正在测试的构建逻辑。TestKit 允许您在调试模式下执行测试,以跟踪意外的测试运行时行为。
TestKit 的路线图
TestKit 还有更多功能。将来,我们希望让使用 TestKit API 更方便。您可以在 设计文档 中阅读所有相关内容。如果您有兴趣贡献,请告诉我们!我们很乐意看到 TestKit 的发展。