单元测试

单元测试

三丰 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 插件和命令行来运行。

相关文章
相关标签/搜索