欢迎光临
我们一直在努力

流式断言器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

 

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

 

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《流式断言器AssertJ介绍》
文章链接:https://www.456zj.com/20998.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址