Truth 1.0:Java 和安卓测试的流畅断言

阅读数:2103 2019 年 8 月 16 日 19:36

Truth 1.0:Java和安卓测试的流畅断言

软件测试很重要,有时也很让人头疼。有的领域天生就很复杂,比如说并发就经常是麻烦的源泉;但更多时候让人头疼的因素往往来自无数细节之中。

复制代码
assertEquals("Message has been sent", getString(notification, EXTRA_BIG_TEXT));
assertTrue(
getString(notification, EXTRA_TEXT)
.contains("Kurt Kluever <kak@google.com>"));

上面的两个断言测试几乎一样,但它们的结构不同。这种结构差异让人很难区分测试内容。

构造这些断言时最好使用流畅 API

复制代码
assertThat(getString(notification, EXTRA_BIG_TEXT))
.isEqualTo("Message has been sent");
assertThat(getString(notification, EXTRA_TEXT))
.contains("Kurt Kluever <kak@google.com>");

流畅 API 还有一些天然优势:

  • IDE 自动完成可以建议适合测试值的断言,包括 containsExactly(permission.SEND_SMS, permission.READ_SMS) 等丰富操作。

  • 失败消息可以包含测试值和预期结果。对比上面的 assertTrue 调用,后者完全没有失败消息。

谷歌针对 Java 和 Android 的流畅断言库是 Truth 。最近谷歌发布了 Truth 1.00 ,它经过多年微调后拥有了稳定的 API。

Truth 1.0:Java和安卓测试的流畅断言

Truth 项目始于 2011 年,一开始是谷歌员工的个人开源项目。之后它被捐赠给谷歌并由 Java 核心库团队接手发展,该团队就是 Guava 的作者。

你可能已经熟悉了像 Hamcrest AssertJ 这样的断言库,它们提供了类似的功能。谷歌设计的 Truth 拥有更简单的 API 和更易读的失败消息。例如下面是来自 AssertJ 的失败消息:

复制代码
java.lang.AssertionError:
Expecting:
<[year: 2019
month: 7
day: 15
]>
to contain exactly in any order:
<[year: 2019
month: 6
day: 30
]>
elements not found:
<[year: 2019
month: 6
day: 30
]>
and elements not expected:
<[year: 2019
month: 7
day: 15
]>

Truth 的等效消息如下:

复制代码
value of:
iterable.onlyElement()
expected:
year: 2019
month: 6
day: 30
but was:
year: 2019
month: 7
day: 15

要了解更多详情可阅读文章“各种库的对比”,或自己试用一下 Truth。

如果你正在为 Android 开发应用,还可以尝试 AndroidX Test。它内置 Truth 扩展,使断言更容易编写,故障消息更清晰:

复制代码
assertThat(notification).extras().string(EXTRA_BIG_TEXT)
.isEqualTo("Message has been sent");
assertThat(notification).extras().string(EXTRA_TEXT)
.contains("Kurt Kluever <kak@google.com>");

即将推出:Truth 的 Kotlin 用户可以期待 Kotlin 特有的增强功能

原文链接: https://opensource.googleblog.com/2019/07/truth-10-fluent-assertions-for-java-and.html

评论

发布