zoukankan      html  css  js  c++  java
  • 流式断言器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

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

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

  • 相关阅读:
    关系图的缩放、拖移、边上的关系显示、自定义等
    数据嵌入js的关系图
    十二周周四
    去除mysql里面重复的行并留下id最小的
    十一周周日
    十一周周六
    计算一个字符串中每个词的数量并降序输出
    账户 需求分析
    《人月神话》阅读计划
    读博客,了解本学期《软件需求与分析》掌握必要的内容
  • 原文地址:https://www.cnblogs.com/zyfd/p/9567380.html
Copyright © 2011-2022 走看看