测试一般分为:单元测试、集成测试(主要看一块代码加进去后,系统会不会有问题)、验收测试和压力测试。
假如一个项目非常的大,测试的东西非常的多,如果不用Junit的话,那么这个工作量是非常大的。单元测试的最基本的一个功能是能进行自动化测试。单元测试都是通过断言的方式来确定结果是否正确,即使用Assert。
一、准备工作
1、从网站上下载junit的新版本,http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22junit%22%20AND%20a%3A%22junit%22 上下载相应的版本,这里下载的是junit4.7版本,下载地址如下:junit4.7.jar下载
2、在eclipse中新建一个java项目,名称为JavaJunitTest(可随意),并再新建一个文件夹jar,用于存放我们下载的junit.jar包,然后把junit-4.7复制到里面jar里面,并使用右键add build path,即添加到类路径中,如下图所示:
3、新建一个类JunitTest.java,如上图图所示结构,内容为:
package com.junit.test;
import org.junit.Assert;
import org.junit.Test;
public class JunitTest {
@Test
public void test2()
{
System.out.println("test2()");
int rel=12;
Assert.assertEquals("不符合结果",2, rel);
}
}
二、进行测试
1、在junit4中提供了一个Assert的类,这个类中有大量的静态方法进行断言的处理,在junit3中由于继承了TestCase,这个TestCase就可以直接assert,而junit4中需要先引入Assert类。如下面代码的使用,其中Assert是断言,在assertEquals方法中,第一个参数是错误时输出结果,第二个参数是程序员预期的结果,而第三个参数是实际结果
package com.junit.test;
import org.junit.Assert;
import org.junit.Test;
public class JunitTest {
@Test
public void test2()
{
System.out.println("test2()");
int rel=23;
Assert.assertEquals("不符合结果",2, rel);
}
}
在使用了Assert类中的assertEquals方法,这方法的第一个参数意思是:如果rel的结果不为2,那么就会打印出“加法有问题”的信息。
如下图所示结果:
使用junit测试比使用main方法测试有很大的不同的,每个标识为@Test的方法都是一个可运行的方法,并且他们之间互不影响,例如一个方法出现问题了,并不影响另外一个方法的运行。这就是单元测试的好处
2、在测试除法除数为0,这个方法应该会抛出异常。如下图现在的测试目标是,如果运行测试方法时,方法没有处理异常,那么这个测试方法就不能通过。那么如何判断不能通过呢,那就是没有进行到Assert断言处,这时就会报ArithmeticException。
如下图所示,我们对异常进行处理,我们就能够看到程序运行结束,在Assert处获得rel的值仍为初始化时的值0 那么我们都知道有异常发生,那么我们就给这个方法直接给这个方法断言有异常,使用代码:@Test(expected=ArithmeticException.class)实现
package com.junit.test;
import org.junit.Assert;
import org.junit.Test;
public class JunitTest {
@Test(expected=ArithmeticException.class)
public void test2()
{
System.out.println("test2()");
int rel=0;
try{
rel=2/0;
}catch(Exception e)
{e.printStackTrace();}
//System.out.println("end");
Assert.assertEquals("不符合结果",2, rel);
}
}
结果如下所示:
上图中,我们断言运算中会抛出异常expected=ArithmeticException.class,结果也抛出异常expected=ArithmeticException.class,所以junit测试是通过的。
下面我们再测一测如果我们断言有异常,但是算法中没有异常,结果如下图所示:显示我们期望的异常而不能正常运算
2、有时在测试时需要有这样的需求,就是对一个方法的时间进行测试,例如,要让一个方法,200毫秒里运行完,如果这个方法200毫秒不能运行完,那么这个方法就应该抛出异常,示例中将方法time中线程沉睡300毫秒,那么这个方法就不可能在200毫秒内完成,所以这个方法就会抛出异常。如下图所示:
因为发生异常,程序都没有运行结束,没输出结尾的end,这就可以做一些方法性能上的测试,把Thread去掉,那么这个测试就可正常通过。