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

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

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

  • 相关阅读:
    Leetcode Binary Tree Preorder Traversal
    Leetcode Minimum Depth of Binary Tree
    Leetcode 148. Sort List
    Leetcode 61. Rotate List
    Leetcode 86. Partition List
    Leetcode 21. Merge Two Sorted Lists
    Leetcode 143. Reorder List
    J2EE项目应用开发过程中的易错点
    JNDI初认识
    奔腾的代码
  • 原文地址:https://www.cnblogs.com/zyfd/p/9567380.html
Copyright © 2020-2023  润新知