Truth:一个流畅的断言框架

作者:Dori Reuveni 、Kurt Alfred Kluever

原文链接:http://googletesting.blogspot.tw/2014/12/testing-on-toilet-truth-fluent.html


为工程师,我们花费大部分的时间来阅读现有的代码,而不是编写新的代码。因此,我们必须确保我们写的代码是清晰的、可读的。这同样适用于我们的测试;我们需要一种方法来清楚的表达我们的测试断言。

Truth是一个开源的、流畅的Java测试框架,使你的测试断言和失败消息更有可读性。通过自动编译,流畅的API使读(和写)测试断言在你的开发环境中更加自然、散文化和易发现。例如,比较JUnit和Truth是如何读以下断言的:

assertEquals("March", monthMap.get(3));         // JUnit
assertThat(monthMap).containsEntry(3, "March");  // Truth

这两个语句都断言一样的对象,但是由Truth编写的断言很容易从左到右读取,而由Junit编写的例子需要“精神回溯”。

相比于JUnit,Truth的另一个优点是增加有用的默认失败消息例如:

ImmutableSet<String> colors = ImmutableSet.of("red", "green", "blue", "yellow");
assertTrue(colors.contains("orange"));  // JUnit
assertThat(colors).contains("orange");  // Truth

在这个例子里,两个断言都将失败;但是JUnit将不会提供有用的错误信息然而,Truth可提供一个简明的错误信息

AssertionError:<[red, green, blue, yellow]> should have contained <orange>

Truth已经可以支持对多数常见JDK类型的专业断言(对象,基本类型,数组,字符串,类,可比较类型,可迭代类型,集合,列表,集合,图等),以及一些瓜娃类型(可选值)。另外,对于其他受欢迎类型的支持也在计划中(异常,迭代器,多重映射,无符号整型,无符号长整型等)。

Truth也是用户扩展型的:你可以很容易的写一个Truth主题,以对你自定义的类型进行流畅的断言。通过创建你自定义的主题,你的断言API和你的失败消息都可以是特定领域的。

Truth的目标不是取代JUnit断言,而是提高对复杂断言和失败消息的可读性。JUnit断言和Truth断言可以(且经常)并存于测试中。
AssertJ 是 JAVA流畅断言库。示例代码:// unique entry point to get access to all assertThat methods and utility methods (e.g. entry) import static org.assertj.core.api.Assertions.*;  // common assertions assertThat(frodo.getName()).isEqualTo("Frodo"); assertThat(frodo).isNotEqualTo(sauron)                  .isIn(fellowshipOfTheRing);  // String specific assertions assertThat(frodo.getName()).startsWith("Fro")                            .endsWith("do")                            .isEqualToIgnoringCase("frodo");  // collection specific assertions assertThat(fellowshipOfTheRing).hasSize(9)                                .contains(frodo, sam)                                .doesNotContain(sauron);  // using extracting magical feature to check fellowshipOfTheRing characters name :) assertThat(fellowshipOfTheRing).extracting("name").contains("Boromir", "Gandalf", "Frodo", "Legolas")                                                   .doesNotContain("Sauron", "Elrond");  // map specific assertions, ringBearers initialized with the elves rings and the one ring bearers. assertThat(ringBearers).hasSize(4)                        .contains(entry(oneRing, frodo), entry(nenya, galadriel))                        .doesNotContainEntry(oneRing, aragorn);  // and many more assertions : dates, file, numbers, exceptions ... 标签:AssertJ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值