流式断言器AssertJ介绍

本文来自网易云社区

作者:范旭斐

大家在使用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") {
			@Override
			public 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

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

相关文章:
【推荐】 什么是高防服务器?

原文地址:https://www.cnblogs.com/zyfd/p/9567380.html

时间: 2024-08-30 16:03:47

流式断言器AssertJ介绍的相关文章

轻量级流式日志计算分析plog+(zabbix+grafana)

plog是一个用python写的流式计算分析框架,适用于轻量级流式数据的分析场景,大数据场景下大家自然想到使用spark等方案. 拿当前的业务场景看,需要对机器上nginx的流日志进行状态码.响应时间.QPS的实时分析,通过zabbix展现在grafana里,QPS在1000以内.传统方法是用shell脚本来计算各种数据,然后通过主动或被动模式传到zabbix里,此种方法有很大局限性,一是grep或awk过滤日志时,很难控制好过滤的数量,过滤的多了严重影响性能,可能上一个数据都没计算出来,这一次

JAVA 流式布局管理器

//流式布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian2 extends JFrame{ //定义组件 JButton[] an = {null,null,null,null,null,null,null,null}; public static void main(String[] args){ //运行本类的构造方法 Jiemian2 jiemian = new Jiemian2(); } public

Java Swing 之流式布局管理器

/** * java 之流式布局 * @author gao */ package com.gao; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; @SuppressWarnings("serial") public class Flow

移动web中的流式布局和viewport知识介绍

1   流式布局 其实  流式布局  就是百分比布局,通过盒子的宽度设置成百分比来根据屏幕的宽度来进行伸缩,不受固定像素的限制,内容向两侧填充. 这样的布局方式  就是移动web开发使用的常用布局方式 2    Viewport 我们猜想下pc页面在移动设备上显示情况. 放不下,缩放? 我们测试下pc页面在移动设备上显示. 默认的缩放的显示的 认识viewport 在移动端用来承载网页的这个区域,就是我们的视觉窗口,viewport(视口),这个区域可是设置高度宽度,可是按比例放大缩小,而且能设

14.5-全栈Java笔记:java.awt这些布局怎么写?|流式|边界|网格

布局管理器 读者会发现,如果使用坐标定位法(空布局),在一个比较复杂的界面上定位每个控件的坐标是一个非常麻烦的工作,而且在界面大小发生改变时,控件的绝对位置也不会随之发生改变.那么如果我们想让用户界面上的组件可以按照不同的方式进行排列怎么办?例如:可以依序水平排列,或者按网格方式进行排列等,其实每种排列方案都是指组件的一种"布局",要管理这些布局,就需要本节学习的布局管理器. 管理布局的类由java.awt包来提供,布局管理器是一组实现java.awt.LayoutManager接口的

大数据技术(1)流式计算与Storm

2011年在海量数据处理领域,Hadoop是人们津津乐道的技术,Hadoop不仅可以用来存储海量数据,还以用来计算海量数据.因为其高吞吐.高可靠等特点,很多互联网公司都已经使用Hadoop来构建数据仓库,高频使用并促进了Hadoop生态圈的各项技术的发展.一般来讲,根据业务需求,数据的处理可以分为离线处理和实时处理,在离线处理方面Hadoop提供了很好的解决方案,但是针对海量数据的实时处理却一直没有比较好的解决方案. 就在人们翘首以待的时间节点,storm横空出世,与生俱来的分布式.高可靠.高吞

Spark Streaming:大规模流式数据处理的新贵(转)

原文链接:Spark Streaming:大规模流式数据处理的新贵 摘要:Spark Streaming是大规模流式数据处理的新贵,将流式计算分解成一系列短小的批处理作业.本文阐释了Spark Streaming的架构及编程模型,并结合实践对其核心技术进行了深入的剖析,给出了具体的应用场景及优化方案. 提到Spark Streaming,我们不得不说一下BDAS(Berkeley Data Analytics Stack),这个伯克利大学提出的关于数据分析的软件栈.从它的视角来看,目前的大数据处

【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(三)流式播放Live HLS视频

HTTP Live Streaming(HLS)是由Apple Inc.实施的非常强大的流视频协议.HLS使用穿过防火墙,代理的HTTP事务,并可以轻松地通过CDN进行分发.因此,该技术能够比RTP或其他基于UDP的协议达到更大的观众观众.今天在线直播的许多视频都是由使用HLS的昂贵系统进行托管,但它们通常很昂贵,需要大量的服务器资源.本教程将向您展示如何设置一个非常实惠的Ubuntu 14.04 VULTR VPS,只使用开源软件来进行HLS直播流事件. 第一步是根据Vultr Doc" Ub

“流式”前端构建工具——gulp.js 简介

Grunt 一直是前端领域构建工具(任务运行器或许更准确一些,因为前端构建只是此类工具的一部分用途)的王者,然而它也不是毫无缺陷的,近期风头正劲的 gulp.js 隐隐有取而代之的态势.那么,究竟是什么使得 gulp.js 备受关注呢? Grunt 之殇 gulp.js 的作者 Eric Schoffstall 在他介绍 gulp.js 的 presentation 中总结了 Grunt 的几点不足之处: 插件很难遵守单一责任原则.因为 Grunt 的 API 设计缺憾,使得许多插件不得不负责一