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

本文來自網易雲社區,經作者范旭斐授權發布。

 

相關文章:
【推薦】 什么是高防服務器?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM