1、先看实例:
T.java 被测试类
package com.bjsxt.junit;
public class T {
public int add(int a,int b){
return a+b;
}
public int devide(int x,int y){
return x/y;
}
}
TTest.java 测试类
package com.bjsxt.junit.test;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import com.bjsxt.junit.T;
public class TTest {
/**
* @BeforeClass在TTest测试类初始化之前就执行,所以static
*/
@BeforeClass
public static void beforeClass(){
System.out.println("beforeClass");
}
/**
* @AfterClass也是static
*/
@AfterClass
public static void afertClass(){
System.out.println("afterClass");
}
/**
* 每个测试方法执行之前都执行
*/
@Before
public void before(){
System.out.println("before");
}
/**
* 每个测试方法执行之后都执行
*/
@After
public void after(){
System.out.println("after");
}
/**
* @Test表示测试方法
*/
@Test
public void testAdd() {
int z = new T().add(5, 3);
assertThat(z, is(8));
}
/**
* @Ignore表示忽略本测试方法
*/
@Ignore
@Test(expected=java.lang.ArithmeticException.class,timeout=100)
//expected表示抛出异常,timeout表示在多少毫米之内执行完本测试方法
public void testDevide() {
int z = new T().devide(8, 0);
assertThat(z, is(4));
}
}
2、笔记
什么是单元测试
JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架( regression testing framework )。 Junit 测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何( How )完成功能和完成什么样( What )的功能。 Junit 是一套框架,继承 TestCase 类,就可以用 Junit 进行自动测试了。
写了个类,要给别人用,会不会有 Bug ?怎么办?测试一下
用 main 方法测试好不好?不好
1、 不能一起运行
2、 太多数情况下需要人为的观察输出确定是否正确
为什么要进行单元测试
重用测试 ,应付将来实现的变化
提高士气,明确知道我的东西是没有问题的
Jdk5 中可以直接引入静态方法如: import static org.junit.Assert.*; 在类中直接使用方法,而非 类 . 方法的方式调用 import org.junit.Assert
Keeps the bar green to keeps the code clean
Junit4 HelloWorld
1、 new Project( 引入 junit 包 )
2、 建立类
3、 建立 testcase
放弃旧的断言,使用 hamcrest 断言
下载 hamcrest ,引入 hamcrest-core 包, hamcrest-library 包
其中表达式位于 org.hamcrest.Matchers 下
1、 使用 assertThat ( manual , machers );
2、 实例
a) assertThat(n, allOf(greaterThan(1),lessThan(15)));
assertThat(n, anyOf(greaterThan(16),lessThan(15)));
assertThat(n , anything());
assertThat(str, is(“eagle”));
assertThat(str, not(“eagle”));
b) assertThat(str, containsString(“eagle”));
assertThat(str, endsWith(“eagle”));
assertThat(str, startsWith(“eagle”));
assertThat(str, equalTo(“eagle”));
assertThat(str, equalToIgnoringCase(“eagle”));
assertThat(str, equalToIgnoringWhiteSpace(“eagle”));
c) assertThat(d,closeTo(3.0,0.3))
assertThat(d,greaterThan(3.0))
assertThat(d,lessThan(3.0))
assertThat(d,greaterThanOrEqualTo(3.0))
assertThat(d,lessThanOrEqualTo(3.0))
d) assertThat ( map, hasEntry(“eagle”,”eagle”))
assertThat ( iterable, hasItem(“eagle”))
assertThat ( map, hasKey(“eagle”))
assertThat ( map, hasValue(“eagle”))
· Fai 核心
anything - 总是匹配, 如果你不关心测试下的对象是什么是有用的
describedAs - 添加一个定制的失败表述装饰器
is - 改进可读性装饰器 - 见下 “Sugar”
· 逻辑
allOf - 如果所有匹配器都匹配才匹配, short circuits ( 很难懂的一个词, 意译是短路, 感觉不对, 就没有翻译)( 像 Java &&)
anyOf - 如果任何匹配器匹配就匹配, short circuits ( 像 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 - 测试字符串匹配
Failure 和 Error
1、 Failuer 是指测试失败,测试对象有错
2、 Error 使指测试程序本身出错
JUnit4 Annotation
import static org.hamcrest.Matchers.*; 在 hamcrest-library 包中
1 、 @Test 测试方法 说明下面的方法未测试方法
a )( expected =XXException.class )源程序中有异常抛出
b) (timeout=xxx) 希望程序在 timeout 设定的时间内执行完成
@Test (expected=java.lang.ArithmeticException. class ,timeout=1)
2 、 @Ignore 被忽略的测试方法
3 、 @Before 每一个测试方法之前运行(例如:打开文件)
4 、 @After 每一个测试方法之后运行(例如:关闭文件)
5 、 @BeforeClass 所有测试开始之前运行 (方法必须为静态方法,类初始化之前运行,建立跟数据库的链接,加载 spring 文件等)类运行之前需要取得耗费时间的资源时
6 、 @AfterClas 所有测试方法结束之后运行(方法必须为静态方法,关闭数据库连接)
运行多个测试
Test Driven Development 测试驱动开发 (TDD)
右击测试包或项目, run as---Open Run Dialog— 选中 Run all tests in the selected project,package,or source folder 选择运行测试文件所在项目,包或文件夹
注意:
1、 遵守约定,比如
a) 类放在 test 包中
b) 类名用 XXXTest 结尾
c) 方法用 testMethod 命名