断言01-Hamcrest与AsserJ比较
本文将简要介绍Junit原生、Hamcrest、以及AssertJ这三个不同时代的经典断言工具。这三个工具可以在不同类型的测试中使用。另外,很多专用自动化测试工具,如RestAssrured等也倾向于自带断言。在了解了经典断言工具后,对于了解这些专用工具自带的断言也更有益处。
Hamcrest
Hamcrest 属于”新一代”的断言工具,Hamcrest这个单词是”matchers”的变位词。它提供了大量丰富的匹配器,能够让断言可读性更高,断言样板代码量更小,更易维护。Hamcrest一经问世,就取得了非常大的成功,甚至一度成为第一个被Junit引入的第三方包,成为Junit4断言的一部分[1]。另外,Hamcrest也开发出了其他语言的版本,如C++, C#, Objective-C, Python, ActionScript 3, PHP, JavaScript, Erlang, and R。
当然,由于以AssertJ为代表的“新新一代”断言工具的出现以及蓬勃发展,Hamcrest又被移除出了Junit5[2], 让测试框架的使用者们可以更加自由的选择断言工具,促进Junit生态圈的发展。
AssertJ
AssertJ与之前的断言工具的最大不同,是引入了流式断言(Fluent Assertion),让断言的编写更加流畅,可读性更强,从而让它大获成功。它甚至还提供了一键转换的工具,将传统的Junit Assert断言转换为AsserJ断言。
Hamcrest与AssertJ比较
热度
首先来比较一下Hamcrest和AssertJ的热度。
【。。。待翻墙。。。】
image001.pngHamcrest在2007年7月首次登陆Maven中央库,最近一次更新则在2012年7月,而AssertJ则在2013年登陆Maven中央库,截至本文写成的2018年8月,当年度已经发布3次。两者均录得了累计超过4000个项目的引用,在Maven中央库的历史排名均处于40位之内,属于明星项目。顺便说一下,Junit以超过7万个项目的引用成为最受欢迎的项目,而TestNG则以6000多次的引用排在20多位,两者差距非常明显[3]。
简要比较
以下是笔者整理的Junit Assert、Hamcrest以及AsserJ的简要比较。
断言工具 | 断言种类 | 断言语法 | 断言类数量 | IDE自动提示 | 软断言及行为 |
---|---|---|---|---|---|
Junit Assert | 一般 | 对象比较 | 一个 | 方便 | Assume,预期不符合则用例跳过 |
Hamcrest | 丰富 | 对象比较 | 多个断言类 | 不方便 | 借助于Assume,行为同上。 |
AssetJ | 丰富 | 流式断言 | 一个 | 方便 | SoftAssertions,预期不符合继续执行,待执行完毕后用例失败 |
关于AsserJ的具体使用,可以参考其官方提供的项目
https://github.com/joel-costigliola/assertj-examples
1 Marc Philipp (21 Oct 2012). "Summary of Changes in version 4.4". JUnit documentation. Retrieved 20 Sep 2016.
2(https://en.wikipedia.org/wiki/Hamcrest#cite_ref-3) "JUnit 5 User Guide - Third-party Assertion Libraries". Retrieved 11 May 2018. https://junit.org/junit5/docs/5.0.0/user-guide/#writing-tests-assertions-third-party
4 https://joel-costigliola.github.io/assertj/assertj-core-converting-junit-assertions-to-assertj.html