Junit是一个单元测试的工具。可以用来检验程序中的方法是否符合预期。
使用JUnit,需要先导入相关的Jar包:hamcrest-core-1.3.jar(用来执行断言)、junit-4.12.jar。
Junit的使用很简单。比如编写有如下的Java文件:Calculator.java
package com.junit.test;
public class Calculator {
private static int result;
public void add(int n){
result=result+n;
}
public void substract(int n){
result=result-1; //Bug:
}
public void multiply(int n){
}
public void divide(int n)throws Exception{
if(n==0)
throw new Exception("0不能做除数");
result=result/n;
}
public void squareRoot(int n){
for(;;); //Bug
}
public void clear(){
result=0;
}
public int getResult() {
return result;
}
}
程序中定义了加、减、乘、除、平方根这几个测试用的方法。
在eclipse中,右键改Java类,选择新建JUnit Test Case,下一步,选择要测试的方法,点击完成。就会创建一个测试用的Java文件。这里是Calculator.java
package com.junit.test;
import static org.junit.Assert.*;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
public static Calculator c = new Calculator();
//这里用来测试add方法。
@Test
public void testAdd() {
c.add(2);
c.add(2);
//此时result的值应该是4。
//assert为断言。assertEquals(期望值,实际值,误差)这个方法,如果期望值与实际值在误差范围内,则通过执行。否则报错。
assertEquals(4,c.getResult());
}
//这里使用@Ignore来忽略此方法
@Ignore
public void testSubstract() {
c.substract(2);
assertEquals(2,c.getResult());
}
@ignore
public void testMultiply() {
c.multiply(10);
}
//因为原方法抛出了异常,且异常并非错误,而是所设计的代码逻辑。所以,使用(expected=相应的异常.class)来判断,如果抛出了期望的异常,也是执行成功。
@Test(expected=Exception.class)
public void testDivide() throws Exception {
c.divide(0);
}
//这里原方法进入了死循环。所以使用(timeout=xxx)来进行判断。如果xxx毫秒时间内程序没有正常执行完毕,则没有通过测试。 timeout也常用来进行复杂逻辑代码的验证。
@Test(timeout=2000)
public void testSquareRoot() {
fail("Not yet implemented");
}
}
测试类中,会生成所选定的测试方法想对应的测试方法。他们都是用@Test注解。这个注解可以理解为把方法都变成了main方法,用来执行。
还有@Ignore注解,这个注解用来跳过该方法。可以根据需要使用。
另外很重要的一些知识点:
1:@Before和@After注解
比如我们要测试数据库的连接程序。链接数据库需要首先建立数据库的连接(甭管是使用连接池还是直接连接数据可),最后还要释放连接。这两步可能会独立出来,供其他的测试方法所公用。这时,在建立JUnit测试类时,创建链接的方法可以使用@Before注解,释放资源的方法可以使用@After注解。
2:使用@Suite.SuiteClasses进行打包测试
比如我们有多个测试类,可以建立一个新的测试类,使用注解将需要测试的类全部罗列进去,进行打包测试
在测试类中,写上:
@RunWith(Suite.class)
@Suite.SuiteClasses({
测试类1.class,
测试类2.class,
........
})
3:@FixMethodOrder(MethodSorters.XXX)指定测试顺序
如果想要指定测试类中方法的执行顺序,因为JVM 并不会根据方法编写的顺序来执行,他的执行顺序是根据反射API返回的顺序来执行的,可能与期望的顺序不同。可以使用@FixMethodOrder(MethodSorted.JVM/NAME_ASCENDING)来指定顺序。JVM代表按照虚拟机的返回的顺序来决定Test方法的执行顺序,显然一般不设置此项。NAME_ASCENDING代表按照字母的升序来执行。我们可以按需要设置、修改Test方法名来排列执行顺序。