Junit 概念,原理这里就不说了,有兴趣的朋友可以查阅相关资料,这篇文章主要是为了快速给大家介绍一下junit4的使用
以及与 junit3的区别,这里默认大家对junit3已经有些理解了。下面就开始吧:
1.先写个简单的被测试类:
package test.junit;
public class
BaseClass {
public String method() {
return this.getClass().getName();
}
}
2.对于这个类的unit测试,我们先看看在junit3中怎么进行测试的吧:
package test.junit;
import junit.framework.TestCase;//引入TestCase类
public class
BaseClassTest extends TestCase {//类必须继承TestCase
BaseClass baseClass;
protected void
setUp() throws Exception {
super.setUp();
baseClass = new BaseClass();
}
public void
testMethod (){//测试方法必须以test开头
//通过assert*来检验
assertTrue(baseClass.method
().equals("test.junit.BaseClass"));
}
}
通过上面这个类,我们对junit3进行一些总结:
1. 必须引入类TestCase(import junit.framework.TestCase;),
2. 必须继承类TestCase (class BaseClassTest extends TestCase)
3. 测试方法必须以test开头(public void testMethod ())
4. 通过assert*方法来判断结果(assertTrue(baseClass.method ().equals("test.junit.BaseClass"));)。
3. 下面来了解一下junit4里面的内部关系吧,下面来看看我们今天的主角junit4是怎么处理这些的吧:
package test.junit;
import org.junit.Test;//引入Test类
import static
org.junit.Assert.*;//引入Assert.*包
public class
BaseClassTestNew {//这里不用再继承TestCase类了。
BaseClass baseClass = new BaseClass();
@Test public void methodOne(){//名字可以按你自己的爱好。但是必须以@Test开头
//还是以assert*来判断
assertTrue(baseClass.methodOne().equals("test.junit.BaseClass"));
}
}
看看多么的简洁,好像少了很多约束,下面通过和junit3的特性进行比较总结junit4的特性:
1.必须引入类TestCase(import junit.framework.TestCase;
è必须引入类Test(import org.junit.Test;),必须引入类(import static org.junit.Assert.*;)
2.必须继承类TestCase (class BaseClassTest extends TestCase)
è不需要
3.测试方法必须以test开头(public void testMethod ())
è不需要,但是类开始的时候要标记 @Test
4.通过assert*方法来判断结果(assertTrue(baseClass.method ).equals("test.junit.BaseClass"));)。
从上面的对比,可以看出junit4与junit3的区别在于:
去掉与类TestCase的偶联性,唯一触发TestCase的地方就是在@Test上。
4.以上就是junit4与junit3的区别与改进,下面再继续看看junit4有哪些新增加的功能吧:
1. @Before 和 @After
类似于init() 和destory(),可以将一些初始化和释放工作放到这里面,每个类都只有一个@Before 和 @After。为了实现这个功能,我们将测试类修改如下:
import org.junit.Test;
//新增加两个类
import org.junit.Before;
import org.junit.After;
import static
org.junit.Assert.*;
public class
BaseClassTestNew {
BaseClass baseClass ; //这里不用进行初始化
@Before public void
runBeforeTest(){
baseClass = new BaseClass();
}
@Test public void method (){
assertTrue(baseClass.method
().equals("test.junit.BaseClass"));
}
@After public void
runAfterTest(){
baseClass.teardownList();
baseClass = null;
}
}
@Before 方法会在 @Test 之前进行,相反 @After 会在所有方法运行完进行。
Junit4同时还支持 @BeforeClass 和 @AfterClass,原理一样,大家可以参考相关资料。
2.TimeOut 属性
Junit4支持timeout,运用如下:
a. 首先在被测试类中增加用于测试timeout的方法:
public void
methodTimeOut() {
try {
Thread.sleep(50);//睡50秒
System.out.println("methodTimeOut");
} catch (InterruptedException e) {
}
}
b.看看怎么测试这个方法:
@Test(timeout=5)
public void
methodTimeOut(){
baseClass.methodTimeOut();
}
1. 增加(timeout=5)这个设置项
2. 运行完 没有输出methodTimeOut,说明这个方法没有执行完,达到效果。
junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类。
1.assertTrue/False([String message,]boolean condition);
判断一个条件是true还是false。感觉这个最好用了,不用记下来那么多的方法名。
2.fail([String message,]);
失败,可以有消息,也可以没有消息。
3.assertEquals([String message,]Object expected,Object actual);
判断是否相等,可以指定输出错误信息。
第一个参数是期望值,第二个参数是实际的值。
这个方法对各个变量有多种实现。在JDK1.5中基本一样。
但是需要主意的是float和double最后面多一个delta的值,可能是误差范围,不确定这个
4.assertNotNull/Null([String message,]Object obj);
判读一个对象是否非空(非空)。
5.assertSame/NotSame([String message,]Object expected,Object actual);
判断两个对象是否指向同一个对象。看内存地址。
7.failNotSame/failNotEquals(String message, Object expected, Object actual)
当不指向同一个内存地址或者不相等的时候,输出错误信息。
注意信息是必须的,而且这个输出是格式化过的。