本文來自網易雲社區
作者:范旭斐
大家在使用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
本文來自網易雲社區,經作者范旭斐授權發布。
相關文章:
【推薦】 什么是高防服務器?