本文来自网易云社区

作者:范旭斐

大家在使用testng、junit做自动化测试的过程中,经常会用到testng、junit自带的断言器,有时候对一个字符串、日期、列表进行断言很麻烦,需要借助到jdk或者第三方包的方法进行处理后断言,无形之中增加了代码量,测试用例方法的代码看起来也不够友好,很臃肿。总体来说,junit&testng的断言API还可以,功能不算强大,只能说是满足我们日常测试的需求。这里向大家推荐一款功能强大的流式断言器——AssertJ,所谓的流式断言就是相较于Assert的单个校验点断言,支持一条断言语句对实际值同时断言多个校验点。

POM依赖

       <dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><scope>test</scope><version>3.9.1</version></dependency>

示例

1.字符串断言

       // 字符串断言assertThat("test").isNotBlank() // 是否为" "字符串.as("字符串断言描述").isSubstringOf("test1") // 是否为test1的一部分.isSameAs("test") // 对象内元素是否相等.isNotEmpty() // 是否为空字符串.isEqualTo("test") // 是否相等.isEqualToIgnoringCase("Test") // 是否相等(忽略大小写).isExactlyInstanceOf(String.class) // 是否是实例.isIn(Arrays.asList("test", "hello")) // 是否在列表中.isIn("test", "hello") // 是否在参数列表中.isInstanceOfAny(String.class, Integer.class) // 是否是实例中任何一个.isNotNull() // 是否不为空.contains("es") // 是否包含es子串.startsWith("te") // te开始.endsWith("st") // st结束.matches(".e.t"); // 是否匹配 .e.t 格式assertThat("").isNullOrEmpty();

2. 数字断言

       // 数字断言assertThat(new Integer(100)).as("数字断言描述").isEqualTo(100) // 是否相等.isBetween(0, 300) // 是否在0,300之间.isNotNull() // 是否非空.isNotZero() // 是否不等于0.isGreaterThanOrEqualTo(80) // 是否大约等于80.isLessThan(200) // 是否小于200.isPositive() // 是否是正数.isNotNegative() // 是否是非负数.isIn(Arrays.asList(100, 200)) // 是否在列表中.isInstanceOf(Integer.class); // 是否是Integer类型

3. 日期断言

       // 日期断言assertThat(new Date()).as("日期断言描述").isAfter("2018-08-01").isAfterYear(2017).isBetween("2018-01-01", "2018-08-31").isEqualToIgnoringHours(new Date().toLocaleString()).isExactlyInstanceOf(Date.class).isInSameHourAs(new Date()).isInThePast().isToday();

4. 列表断言

       // 列表断言assertThat(Arrays.asList("world", "hello")).as("列表断言描述").isNotEmpty() .isNotNull().isInstanceOf(List.class).isSubsetOf("hello", "world").contains("hello").containsOnlyOnce("world").startsWith("world").endsWith("hello");

5. 字典断言

       // 字典断言Map foo = Maps.newHashMap();foo.put("A", 1);foo.put("B", 2);foo.put("C", 3);assertThat(foo).as("字典断言描述").isNotNull() // 是否不为空.isNotEmpty() // 是否size为0.hasSize(3) // size是否为3.contains(entry("A", 1)) // 是否包含entry.containsKeys("A") // 是否包含key.containsValue(1); // 是否包含value

6. 对象断言

       // 对象断言User user1 = new User();user1.setName("Tom");user1.setAge(12);User user2 = new User();user2.setName("Tom");user2.setAge(12);User user3 = user1;assertThat(user1).as("对象断言描述").isEqualToComparingFieldByField(user2) //user1的每个字段是否与user2相同.isExactlyInstanceOf(User.class) //user1是否是User类的对象.isSameAs(user3) //是否是同一个对象.isNotNull() //是否非空.hasFieldOrProperty("name") //是否含有name字段.hasFieldOrPropertyWithValue("age", 12); //是否含有age字段,且值为12

可以看到assertj提供的断言功能非常强大,往往junit&testng的assert需要多行代码来断言,用assertj只需要一步就够了。

TestNG&Junit转换工具

如果想将junit&testng的断言转换为assertj,官方还提供了转换工具:

http://joel-costigliola.github.io/assertj/assertj-core-converting-junit-assertions-to-assertj.html

http://joel-costigliola.github.io/assertj/assertj-core-converting-testng-assertions-to-assertj.html

自定义断言条件与自定义断言

如果觉得这个功能不够用,assertj还可以自定义断言条件:

       Set expectedSet = new HashSet();expectedSet.add("haha");expectedSet.add("hehe");Condition setConainsCondition = new Condition("setConainsCondition") {@Overridepublic boolean matches(String value) {              return expectedSet.contains(value);}};assertThat("haha").is(setConainsCondition);assertThat("xxx").isNot(setConainsCondition);

也可以自动义断言,这里是写的一个对string类型是否包含char字符的一个自定义断言:

package com.netease.kaola.onlinetest.test.bvt.dubbok;import org.assertj.core.api.AbstractAssert;public class CharacterAssert extends AbstractAssert {  public CharacterAssert(String actual) {     super(actual, CharacterAssert.class);}  public static CharacterAssert assertThat(String actual) {       return new CharacterAssert(actual);}    public CharacterAssert hasChar(char c) {isNotNull();        if (!actual.contains(Character.toString(c))) {failWithMessage("Expected string <%s> contains character <%s>, but not", actual, Character.toString(c));}       return this;}   public CharacterAssert notHasChar(char c) {isNotNull();     if (actual.contains(Character.toString(c))) {failWithMessage("Expected string <%s> don't contains character <%s>, but yes", actual,Character.toString(c));}      return this;}
}

引用自定义断言:

CharacterAssert.assertThat("string").hasChar('s').notHasChar('a');

官方文档:http://joel-costigliola.github.io/assertj/

参考博客:https://blog.csdn.net/u011054333/article/details/55156896

网易云大礼包:https://www.163yun.com/gift

本文来自网易云社区,经作者范旭斐授权发布。

相关文章:
【推荐】 让你知晓内容安全的边界:盘点2017、2018这两年的内容监管
【推荐】 HBase原理–所有Region切分的细节都在这里了
【推荐】 “网易有钱”sketch使用分享

流式断言器AssertJ介绍相关推荐

  1. 使用 MediaSource 搭建流式播放器

    https://zhuanlan.zhihu.com/p/26374202 使用 MediaSource 搭建流式播放器 Starkwang ​ JavaScript 话题的优秀回答者 137 人赞同 ...

  2. JStorm—实时流式计算框架入门介绍

    JStorm介绍   JStorm是参考storm基于Java语言重写的实时流式计算系统框架,做了很多改进.如解决了之前的Storm nimbus节点的单点问题.   JStorm类似于Hadoop ...

  3. 流式计算storm核心组件介绍以及入门案例---跟着就能在本地跑起来的storm项目

    关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参 ...

  4. 实时流式处理平台功能介绍

    作者:赵平 导读:在上一篇Wormhole系列文章中,我们介绍了Wormhole的设计思想,并给出了Stream.UMS.Flow.Namespace等相关概念的具体定义,从文章中我们得知,Wormh ...

  5. 流式计算-Storm基本介绍

    1.离线计算是什么? 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据.MapReduce批量计算数据.Hive批量计算数据. ...

  6. 什么是Oozie - 流式调度器

    为什么要有Oozie? 在数据业务场景,对于数据的处理往往是分阶段处理,而不同的阶段可能采用了不同的技术框架去完成这个业务需求,且可能在不同的阶段要干不同的事. 炒饭(锅) à 吃饭(碗) à 筷子( ...

  7. Golang zip流式解析器

    Golang标准库 archive/zip 提供了对zip压缩包的解析功能,主要的NewReader方法签名为: func NewReader(r io.ReaderAt, size int64) ( ...

  8. 软件测试常见断言,断言神器AssertJ快速入门

    本帖已被设为精华帖!, 1.背景 在设计自动化cases时,遵守的核心原则是3A(Arrange-> Actor ->Assert)原则; 断言工具是否强大直接影响到用例的执行效率,本文将 ...

  9. 紫外线杀菌器:过流式Photoscience紫外线杀菌器

    CRAXULTRA紫外线公司是中国唯一一家代理商.所经销的aquafine紫外线消毒器.WATERTECH紫外线消毒灯.飞利浦紫外线.HANOVIA紫外线.AQUABEST紫外线远销海内外,适用于纯水 ...

最新文章

  1. mysql约束日期_MySQL的约束、事务、字符串、日期、数学相关及其他补充
  2. java 多态判断非空_跳槽涨薪季面试题之java基础(一)
  3. 爬虫学习笔记(十五)——加密解密
  4. 【机器视觉】机器视觉光源详解
  5. [极客大挑战 2019]EasySQL
  6. SqlServer2008卸载掉
  7. 使用Python Tkinter开发GPGGA的坐标转换工具
  8. 皮尔逊相关系数,斯皮尔曼等级相关系数,(易错!!)假设检验 ,SPSS
  9. 量子计算机epr,从EPR到量子信息[转] - 物理 - 小木虫 - 学术 科研 互动社区
  10. dubbo源码分析第七篇一服务暴露第三小节一远程暴露内核剖析
  11. 第1卦 乾为天(乾卦) 刚健中正 上上卦
  12. 一张图看懂MTK 芯片命名规则
  13. 道高一尺,魔高一丈--加密与解密的此消彼长
  14. C#获取本机局域网ip和公网ip
  15. IBM ThinkPad 机子无法开机的解决办法 - 按开机键没有反应 - E49
  16. QT QDateTime获取当前时间且分出年月日时分秒
  17. Foreground-aware Pyramid Reconstruction for Alignment-free Occluded Person Re-identification
  18. Faster-RCNN论文细节原理解读+代码实现gluoncv(MXNet)
  19. 弘玑Cyclone完成近4000万美元B轮融资,全面加速RPA平台建设
  20. PbootCMS发布接口_免登陆开源

热门文章

  1. MC9S12:AD采集显示实验
  2. 在linux上安装jdk_如何在Linux上安装Java
  3. Spring(1) Spring的7种事务传播行为
  4. PostGresql四舍五入、小数转换、百分比用法
  5. Keil C51编译/链接/优化
  6. 兰石集团发力智能制造 看老牌国企的转型升级之路
  7. windows核心编程---未处理异常,向量化异常处理与C++异常
  8. vue生命周期函数、react生命周期函数、微信小程序生命周期函数、uni-app生命周期函数,简介及图示
  9. Autoware 障碍物车辆意图与轨迹预测
  10. 节点操作 ------------- 父节点