三豐 soft張三丰
編程
單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,通常來講,要根據實際狀況去斷定其具體含義,如C語言中單元指一個函數,Java裏單元指一個類,圖形化的軟件中能夠指一個窗口或一個菜單等。總的來講,單元就是人爲規定的最小的被測功能模塊。單元測試是在軟件開發過程當中要進行的最低級別的測試活動,軟件的獨立單元將在與程序的其餘部分相隔離的狀況下進行測試。
在一種傳統的結構化編程語言中,好比C,要進行測試的單元通常是函數或子過程。在像C++這樣的面向對象的語言中, 要進行測試的基本單元是類。對Ada語言來講,開發人員能夠選擇是在獨立的過程和函數,仍是在Ada包的級別上進行單元測試。單元測試的原則一樣被擴展到第四代語言(4GL)的開發中,在這裏基本單元被典型地劃分爲一個菜單或顯示界面。
常常與單元測試聯繫起來的另一些開發活動包括代碼走讀(Code review),靜態分析(Static analysis)和動態分析(Dynamic analysis)。靜態分析就是對軟件的源代碼進行研讀,查找錯誤或收集一些度量數據,並不須要對代碼進行編譯和執行。動態分析就是經過觀察軟件運行時的動做,來提供執行跟蹤,時間分析,以及測試覆蓋度方面的信息。數組
Hamcrest是用於Java的單元測試的框架,它使用matcher匹配器來進行斷言。在Spring-boot-starter中集成了Hamcrest,無需而外引入。markdown
1.is框架
String str1 = "text"; String str2 = " text "; assertThat(str1, is(equalToIgnoringWhiteSpace(str2)));
String str1 = "text"; String str2 = "text"; assertThat(str1, is(str2));
2.not
和is使用方式同樣,只是含義相反。編程語言
String str1 = "text"; String str2 = " text "; assertThat(str1, not(equalToIgnoringWhiteSpace(str2)));
String str1 = "text"; String str2 = "text"; assertThat(str1, not(str2));
3.containsString
是否包含子串ide
String str1 = "text123"; String str2 = "text"; assertThat(str1, containsString(str2));
4.覺得某個字段開頭/結尾函數
String str1 = "text123"; assertThat(str1, startsWith("text"));// 以某個字符開頭 assertThat(str1, endsWith("text"));// 以某個字符開頭
5.判斷兩個對象是否爲同一個實體單元測試
Cat cat=new Cat(); assertThat(cat, sameInstance(cat));
6.相似OR的效果測試
String str = "calligraphy"; String start = "call"; String end = "foo"; assertThat(str, anyOf(startsWith(start), containsString(end)));
7.相似AND的效果idea
String str = "calligraphy"; String start = "call"; String end = "phy"; assertThat(str, allOf(startsWith(start), endsWith(end)));
1.匹配空串
String str = ""; assertThat(str, isEmptyString()); // 空字符串 assertThat(str, isEmptyOrNullString()); // 空字符串或者null
2.匹配字符串相等
String str1 = "text"; String str2 = " text "; assertThat(str1, equalToIgnoringWhiteSpace(str2)); // 忽略左右空白 assertThat(a, equalToIgnoringCase(b)); //忽略大小寫
1.檢查某個元素是否在集合中
List<String> collection = Lists.newArrayList("ab","cd","ef"); assertThat(collection, hasItem("cd")); assertThat(collection, not(hasItem("zz"))); assertThat(collection, hasItems("cd", "ab")); // 檢查多個元素是否在集合中
2.檢查全部元素
List<String> collection = Lists.newArrayList("ab","cd","ef"); assertThat(collection, hasItems("ab","cd","ef")); assertThat(collection, hasItems("cd", "ab","ef")); // 錯誤 assertThat(collection, hasItems("ab","cd")); // 錯誤 assertThat(collection, containsInAnyOrder("cd", "ab","ef")); //正確,不區分順序
3.爲空檢查
List<String> collection = Lists.newArrayList("ab","cd","ef"); assertThat(collection, empty()); // false, 用於檢查集合類型
String[] array = new String[] { "ab" }; assertThat(array, emptyArray()); // false
Map<String, String> maps = Maps.newHashMap(); assertThat(maps, equalTo(Collections.EMPTY_MAP));
Iterable<String> collection = Lists.newArrayList(); assertThat(collection, emptyIterable());
4.檢查數目
List<String> list = Lists.newArrayList("ab", "cd", "ef"); assertThat(list, hasSize(3));
Iterable<String> list = Lists.newArrayList("ab", "cd", "ef"); assertThat(list, iterableWithSize(3));
5.檢查每項的條件
List<String> list = Lists.newArrayList("ab", "cd", "ef"); assertThat(list, everyItem(equalTo("ab")));
定義一個City的bean
@Data @AllArgsConstructor public class City { String name; String state; }
1.測試是否存在某個屬性
City city = new City("shenzhen", "CA"); assertThat(city, hasProperty("state")); assertThat(city, hasProperty("state", equalTo("CA"))); // 判斷是否存在某個屬性,而且是否存在某個特性值
2.判斷兩個對象property值是否同樣
City city = new City("San Francisco", "CA"); City city2 = new City("San Francisco", "CA"); assertThat(city, samePropertyValuesAs(city2));
JUnit 5 對 Java 運行環境的最低要求是 Java 8。
IntelliJ IDEA支持自2016.2以後支持junit5。
推薦使用IDEA 2017.3或以後的版本。
各idea版本和支持的junit5版本對照:
junit5經常使用註解:
JUnit 5 提供了三種不一樣的方式來執行測試用例,分別是經過 Gradle 插件、Maven 插件和命令行來運行。