软件测试很重要,有时也很让人头疼。有的领域天生就很复杂,比如说并发就经常是麻烦的源泉;但更多时候让人头疼的因素往往来自无数细节之中。
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 项目始于 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
评论