TestKit 简介:用于功能性测试 Gradle 构建逻辑的工具包
简介
自动化测试是启用软件开发实践(例如重构、持续集成和交付)的必要先决条件。虽然为应用程序代码编写单元测试、集成测试和功能测试已成为行业规范,但可以公平地说,构建自动化领域的测试尚未成为主流。
但为什么我们不对构建逻辑应用相同的成熟测试实践呢?最终,构建逻辑与应用程序代码一样重要。它帮助我们以自动化、可重现和可靠的方式向客户交付生产软件。可能有许多理由跳过测试;然而,突出的原因之一是用于制定构建逻辑的数据定义格式。过去,如果没有合适的工具,为基于 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 添加到项目中。
-
跨版本兼容性测试。您想验证构建脚本是否与特定 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 不断发展。