單元測試

單元測試

三豐 soft張三丰
單元測試編程

單元測試

單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,通常來講,要根據實際狀況去斷定其具體含義,如C語言中單元指一個函數,Java裏單元指一個類,圖形化的軟件中能夠指一個窗口或一個菜單等。總的來講,單元就是人爲規定的最小的被測功能模塊。單元測試是在軟件開發過程當中要進行的最低級別的測試活動,軟件的獨立單元將在與程序的其餘部分相隔離的狀況下進行測試。
在一種傳統的結構化編程語言中,好比C,要進行測試的單元通常是函數或子過程。在像C++這樣的面向對象的語言中, 要進行測試的基本單元是類。對Ada語言來講,開發人員能夠選擇是在獨立的過程和函數,仍是在Ada包的級別上進行單元測試。單元測試的原則一樣被擴展到第四代語言(4GL)的開發中,在這裏基本單元被典型地劃分爲一個菜單或顯示界面。
常常與單元測試聯繫起來的另一些開發活動包括代碼走讀(Code review),靜態分析(Static analysis)和動態分析(Dynamic analysis)。靜態分析就是對軟件的源代碼進行研讀,查找錯誤或收集一些度量數據,並不須要對代碼進行編譯和執行。動態分析就是經過觀察軟件運行時的動做,來提供執行跟蹤,時間分析,以及測試覆蓋度方面的信息。數組

前言

Hamcrest是用於Java的單元測試的框架,它使用matcher匹配器來進行斷言。在Spring-boot-starter中集成了Hamcrest,無需而外引入。markdown

核心API

1.is框架

  • 使用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使用方式同樣,只是含義相反。編程語言

  • 使用not匹配器使得程序更加易懂
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)));

Text 匹配器

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)); //忽略大小寫

Collections 匹配器

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爲空檢查
Map<String, String> maps = Maps.newHashMap();
assertThat(maps, equalTo(Collections.EMPTY_MAP));
  • Iterable爲空檢查
Iterable<String> collection = Lists.newArrayList();
assertThat(collection, emptyIterable());

4.檢查數目

  • 檢查集合數目
List<String> list = Lists.newArrayList("ab", "cd", "ef");
assertThat(list, hasSize(3));
  • 5.檢查iterable數目
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")));

Bean 匹配器

定義一個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));

idea使用junit5

JUnit 5 對 Java 運行環境的最低要求是 Java 8。
IntelliJ IDEA支持自2016.2以後支持junit5。
推薦使用IDEA 2017.3或以後的版本。
各idea版本和支持的junit5版本對照:
單元測試
junit5經常使用註解:
單元測試

JUnit 5 提供了三種不一樣的方式來執行測試用例,分別是經過 Gradle 插件、Maven 插件和命令行來運行。

相關文章
相關標籤/搜索