1、 介绍:
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
2、Junit介绍
①Junit是一款Java语言的单元测试使用的框架,Eclipse是直接对junit进行了集成的,所以我们可以直接使用。
②Junit4是基于注解的;
JUnit 5全然使用当前的Java 8重写了全部代码。因此JUnit 5的运行条件是Java 8环境。
DBunit 是一种扩展于JUnit的数据库驱动测试框架。
3、Junit下载与安装:
① 直接官网下载jar,加入项目中build path;
② 使用Mavne:
③ 工具的IDE自身集成:
4、Junit的使用
①
② 在编写测试类的时候,测试类的名称最好使用待测试类的名称+test;测试方法最好是test+待测试的方法名字.
③ 测试方法上加注解@test
④ 使用断言Assert 判断结果
⑤ 运行
5、Junit的断言
①Assert类常用断言方法:
Javadoc 中充满了这8个方法的便捷形式。这些便捷形式使得传递在测试中需要的任何类型都很简单。以assertEquals方法为例,它就有20种形式!大多数形式都是便捷形式,最终还是调用了核心的assertEquals(String message,Object expected, Object actual)方法。其实我一直比较好奇的,为什么Assert类没有assertNotEquals方法。
另外在junit4中,也加入了AssertArrayEquals方法和AssertThat方法,这2个方法一个用来比较数组,一个用来使用matcher做自定义校验。
②特殊断言AssertThat
JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher
—-注意事项:
- 必须导入JUnit4.4之后的版本以及hamcrest-core.jar和hamcrest-library.jar才能使用assertThat方法
- 要用junit中的assertThat来进行断言,记住静态导入:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
语法:
assertThat(T actual, Matcher matcher);
assertThat(String reason, T actual, Matcher matcher);
其中actual为需要测试的变量,matcher为使用Hamcrest的匹配符来表达变量actual期望值的声明;
- Hamcrest匹配器的用法
Hamcrest是一个测试的框架,它提供了一套通用的匹配符Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,指定所想设定的测试条件。
hamcrest常用的匹配器:
核心:
anything - 总是匹配,如果你不关心测试下的对象是什么是有用的
describedAs - 添加一个定制的失败表述装饰器
is - 改进可读性装饰器 - 见下 “Sugar”
逻辑:
allOf - 如果所有匹配器都匹配才匹配,像Java里的&&
anyOf - 如果任何匹配器匹配就匹配,像Java里的||
not - 如果包装的匹配器不匹配器时匹配,反之亦然
对象:
equalTo - 测试对象相等使用Object.equals方法
hasToString - 测试Object.toString方法
instanceOf, isCompatibleType - 测试类型
notNullValue, nullValue - 测试null
sameInstance - 测试对象实例
Beans:
hasProperty - 测试JavaBeans属性
集合:
array - 测试一个数组元素test an array’s elements against an array of matchers
hasEntry, hasKey, hasValue - 测试一个Map包含一个实体,键或者值
hasItem, hasItems - 测试一个集合包含一个元素
hasItemInArray - 测试一个数组包含一个元素
数字:
closeTo - 测试浮点值接近给定的值
greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - 测试次序
文本:
equalToIgnoringCase - 测试字符串相等忽略大小写
equalToIgnoringWhiteSpace - 测试字符串忽略空白
containsString, endsWith, startsWith - 测试字符串匹配
- 自定义Hamcrest匹配器
6、Junit核心注解
①、基础
/*
* @Test:将一个普通方法修饰为一个测试方法
* @Test(exception=XXX.class)
* @Test(time=毫秒)
* @BeforeClass:它会在所有的测试方法前被执行,static修饰
* @AfterClass:它会在所有的测试方法后被执行,static修饰
* @Before:它会在每一个测试方法前被执行一次
* @After:它会在每一个测试方法后被执行一次
* @Ignore:省略
* @RunWith:修改运行器org。junit。runner。Runner
*
* */
其实@Test不仅可以修饰一个普通方法为测试方法,还可以获取异常或者控制测试方法的执行时间
② @Test的功能
A,获取异常代码展示
1,获取异常,对异常的捕获:@Test(expected=XXX.class)
2,没有通过@Test(expected=ArithmeticException.class)注解时代码以及结果:
B,控制测试代码执行时间,代码展示
测试方法控制@Test(timeout=毫秒),主要是针对代码中有循环代码的测试控制或者超时运行不符合预期的判定
1,我们使用对一个死循环进行测试:
1 package com.duo.util;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.Test;
6
7 public class Anotation {
8
9 @Test(timeout=2000)
10 public void testWhile(){
11 while(true){
12 System.out.println("run forever...");
13 }
14 }
15 }
结果及时运行2秒后系统自动停止运行;
2,让当前线程运行2000毫秒,测试代码运行3000毫秒,符合预期结果
1 package com.duo.util;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.Test;
6
7 public class Anotation {
8
9 @Test(timeout=3000)
10 public void testReadFile(){
11 try {
12 Thread.sleep(2000);
13 } catch (InterruptedException e) {
14 // TODO Auto-generated catch block
15 e.printStackTrace();
16 }
17 }
18 }
运行结果通过;
也可以通过调整测试时间比线程时间小,测试不符合预期的场景;