woman doing workout in room

Apache Groovy:使用断言编写更清晰、更可靠的代码

Groovy 的 assert 语句内联验证代码行为。它抛出带有详细信息的错误以进行调试,并有助于…
首页 » 博客 » Apache Groovy:使用断言编写更清晰、更可靠的代码

之前的 文章中,我回顾了一些 Groovy 的基础知识。如果您想解锁 Groovy 的强大功能,本系列将引导您了解是什么使 Groovy 成为对开发人员如此有价值的语言。 (如果您尚未安装 Groovy,请阅读本系列的介绍。)

正如您所见,Groovy(默认情况下)是一种动态类型语言。如果您不确定这意味着什么,请看以下分解:

var m = new Map<String,Integer>()

在 Java 中,编译器通过从右侧推断 m 的类型,在编译时确定 m 的类型。Groovy(默认情况下)类型确定、检查和强制转换发生在运行时——因此它是“动态”类型的,而不是 Java 中的“静态”类型。

回顾了您的记忆,让我们总结一下三个主要要点:

  • Groovy 通过设计来享受其动态类型。它提供了许多有趣的机制来研究,例如元编程和可扩展的元类。这些提供了许多像 Python 那样提供的广泛的类型灵活性,但在正式和受控的范围内。
  • Groovy 代码,无论是整个类还是仅其中的某些方法,都可以编译为静态类型并进行强类型检查。
  • 动态类型编程语言中“好代码”的概念与测试的概念,甚至可能是测试驱动开发的概念密不可分。

如果您有兴趣使用静态类型,请查看这份 Groovy 官方文档。要继续探索 Groovy 的元编程功能,请查看这份 Groovy 官方文档。由于Grails Web 应用程序框架,我有很多关于其他人元编程的实践经验。设计令人印象深刻,但高度元编程的类使调试错误成为一场噩梦。回溯可能长达数百行,并引用许多我从未听说过的类。

这让我回到了测试的重要性以及 Groovy 提供的帮助测试的关键功能——强大的 assert 语句。

Groovy 用户很可能在Mr. Haki 的博客上遇到过 Groovy 代码的精彩简洁示例。它使用 Groovy assert 语句来演示某些代码构造的预期结果。

Java 用户已经熟悉在 1.4 版本中添加的 assert 语句。与 Java 版本相比,Groovy 版本信息更丰富,并且默认情况下永远不会禁用。让我们仔细看看:

1   def l1 = [1, 2, 3, 4]
2   def l2 = [*(1..4)]
       
3   println "l1 $l1"
4   println "l2 $l2"
5   println "l1 == l2 ${l1 == l2}"
6   println "l1 === l2 ${l1 === l2}"
       
7   assert l1 == l2
8   assert l1 === l2

第一行定义了一个新的 List 实例 l1,其元素是介于 1 和 4 之间的整数。

第二行定义了一个新的 List 实例 l2,使用 spread 运算符 – * – 应用于范围 1..4 以创建一个包含介于 1 和 4 之间的整数的列表。

第三行到第四行打印出 l1l2

l1l2 引用的列表在功能上是相等的,但 l1l2 不太可能引用相同的列表。您可能从本系列关于参数的第六篇文章中回忆起,== 测试功能相等性,而 === 测试“同一性”。

第五行打印出如果 l1 在功能上等于 l2 则为 true。

第六行打印出如果 l1l2 相同则为 true。

第七行到第八行使用 Groovy assert 语句来测试这两个条件。失败的 assert 将抛出 java.lang.AssertionError 的实例。成功的 assert 对此保持沉默。

所以你可以说第五行和第六行或多或少解决了与第七行和第八行相同的问题,尽管在条件为 true 时肯定地确认,而不仅仅是在条件为 false 时。

当您运行此脚本时,您将看到:

$ groovy Groovy18a.groovy
l1 [1, 2, 3, 4]
l2 [1, 2, 3, 4]
l1 == l2 true
l1 === l2 false

捕获:断言失败

assert l1 === l2
       |  |   |
       |  |   [1, 2, 3, 4]
       |  false
       [1, 2, 3, 4]

断言失败

assert l1 === l2
       |  |   |
       |  |   [1, 2, 3, 4]
       |  false
       [1, 2, 3, 4]
CODE
	at 
	Groovy18a.run(Groovy18a.groovy:10)

在运行此脚本之前,您可能已经推断出 l1 == l2true,而 l1 === l2false。但是看看 assert 语句在表达式为 false 时提供的信息,您会看到:

  • assert 语句中表达式的值。
  • 触发 assert 语句的 false 结果发生的位置。

现在想象一下在开发和测试时在您的代码中插入这样信息丰富的 insert 语句,并将它们留在那里以提供更好的可维护性。可以公平地说,assert 语句让程序员没有理由在您可以如此轻松地测试它们时进行假设。

既然我已经让您至少对测试主题有了一点兴趣,您可能想更深入地研究Groovy 官方文档

结论

assert 语句是一个强大的工具,用于直接在您的代码中验证代码行为。其简洁的语法和信息丰富的错误消息使其成为在开发过程早期捕获问题的理想选择。为了获得更健壮和可维护的 Groovy 代码,请在您的项目中始终如一地使用断言。

作者

如果您喜欢这篇文章,您可能也会喜欢这些