写点什么

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

  • 2019-08-16
  • 本文字数:1037 字

    阅读完需:约 3 分钟

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


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


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


Truth 的等效消息如下:


value of:iterable.onlyElement()expected:year: 2019month: 6day: 30
but was:year: 2019month: 7day: 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


2019-08-16 19:362612

评论

发布
暂无评论
发现更多内容

使用 Prometheus 监控的一些注意事项

耳东@Erdong

监控 Prometheus

linux信号操作

SkyFire

Linux 信号

NFS(网络文件系统)配置(Ubunut/Deepin等系统)

SkyFire

Linux NFS

linux文本处理四件套的简单用法

SkyFire

Linux sed grep awk find

架构训练营模块三作业

沈益飞

架构训练营 架构师训练营 4 期

瞰源 | 别逗了,同学!开源不是点赞送礼

OpenTEKr

狄安瞰源

28天写作挑战复盘

圣迪

灵魂洗礼

运维意识

搬砖的周狮傅

开发感想

架构训练营第四期 作业3

supermenG

架构师训练营 4 期

比格云CEO 诸葛辉:本土开源力量的崛起,正为底层技术基础设施掀起一股中国风 I OpenTEKr 大话开源 Vol.4

OpenTEKr

大话开源

架构实战营 4 期第三模块作业

jialuooooo

架构实战营

元宇宙100讲-0x010

hackstoic

元宇宙

spring 源码解析一、概述

xzy

Java spring spring源码

瞰源 | 假领子的流行经济学看开源

OpenTEKr

狄安瞰源

ClickPaaS 胡柏:开源不是童话,它背后的商业逻辑正是其哲学的另一面体现 I OpenTEKr 大话开源 Vol.3

OpenTEKr

大话开源

Thinking Agile 2021,Being Agile 2022

Bruce Talk

敏捷 随笔 Agile

关于Kafka分区leader迁移的感想

Kafka中文社区

mysqlx学习

SkyFire

mysqlx

学生管理系统架构文档

皓月

架构实战营 #架构实战营 「架构实战营」

git普通库与裸库

SkyFire

git

gtest入门

SkyFire

c++ GTest

Golang的通道复用上手(三)

liuzhen007

go语言 28天写作 12月日更

性能分析之系统资源饱和度

zuozewei

Linux 性能分析 12月日更

模块三作业

whoami

「架构实战营」

架构实战营 - 模块 3 课后作业

tony

C++11 extern template

SkyFire

C++11 template

学生管理系统架构设计

Evan

linux库打桩

SkyFire

Linux hook

Modern-Cpp学习笔记

SkyFire

c++

2021年,你读过哪些书?(29/28)

赵新龙

28天写作

关于net6中宿主模型的一点点看法

喵叔

28天写作 12月日更

Truth 1.0:Java和安卓测试的流畅断言_语言 & 开发_Chris Povirk_InfoQ精选文章