前面已经写过一个例子了,但是那个例子只是入门,本例主要说说JUnit中用到的annotation,其实在上例中已经使用过了,那就是测试方法时用到的@Test。上例中讲到了JUnit测试的书写规范,包括包名(原包名.test),类名(原类名Test),其实还有方法名(test原方法名),这一点在上例中没讲到,因为上例使用的是eclipse自动创建Test Case,这是需要注意的。另外需要说明的一点是本例和上例使用的都是JUnit4。
1.普通方法使用的annotation为@Test,他有2个可选参数,形式为@Test(expected=xx,timeout=yy),其中xx表示Class<? extends Throwable> org.junit.Test.expected(),相当于抛出异常,对发生异常的方法使用此参数则测试能够通过;yy表示long org.junit.Test.timeout(),表示超时的毫秒数,用到测试方法的执行时间。实例如下:
待测试的JUnit类
package com.baosight.junit;
/**
*
* <p>Title:JUnit </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author yuan
* @date 2016-4-12 下午9:49:19
*/
public class JUnit {
/**
* 求和
* @Title: add
* @Description: TODO
* @param x
* @param y
* @return
* @return int
* @author yuan
* @date 2016-4-12下午9:49:39
*/
public int add(int x,int y){
return x+y;
}
/**
* 除法
* @Title: divide
* @Description: TODO
* @param x
* @param y
* @return
* @return int
* @author yuan
* @date 2016-4-13下午8:52:49
*/
public int divide(int x,int y){
return x/y;
}
}
测试类JUnitTest
package com.baosight.junit.test;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.After;
import org.junit.AfterClass;
import com.baosight.junit.JUnit;
/**
* <p>Title:IUnitTest </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author yuan
* @date 2016-4-12 下午9:51:22*/
public class IUnitTest {
/**
* 在所有方法之前执行
* @Title: beforeClass
* @Description: TODO
* @return void
* @author yuan
* @date 2016-4-13下午9:36:13
*/
@BeforeClass
public static void beforeClass(){
System.out.println("BeforeClass");
}
/**
* 在所有方法之后执行
* @Title: afterClass
* @Description: TODO
* @return void
* @author yuan
* @date 2016-4-13下午9:36:45
*/
@AfterClass
public static void afterClass(){
System.out.println("AfterClass");
}
/**
* 在每个方法执行之前执行
* @Title: before
* @Description: TODO
* @return void
* @author yuan
* @date 2016-4-13下午9:37:02
*/
@Before
public void before(){
System.out.println("Before");
}
/**
* 在每个方法执行之后执行
* @Title: after
* @Description: TODO
* @return void
* @author yuan
* @date 2016-4-13下午9:37:42
*/
@After
public void after(){
System.out.println("After");
}
/**
* 测试
* @Title: testAdd
* @Description: TODO
* @return void
* @author yuan
* @date 2016-4-12下午9:52:19
*/
@Ignore//此方法被忽略,不执行
@Test
public void testAdd() {
int z = new JUnit().add(3, 5);
assertEquals(8, z);//成功
assertThat(z, is(8));//成
assertThat(z, allOf(greaterThan(3),lessThan(9)));//成功
assertThat(z, anyOf(greaterThan(8),lessThan(9)));//失败
}
/**
* 测试
* @Title: testDivide
* @Description: TODO
* @return void
* @author yuan
* @date 2016-4-13下午8:54:06
*/
@Test(expected=java.lang.ArithmeticException.class,timeout=1)
public void testDivide() {
int z = new JUnit().divide(8, 0);
assertEquals(4, z);//成功
assertThat(z, is(4));//成
assertThat(z, allOf(greaterThan(3),lessThan(9)));//成功
assertThat(z, anyOf(greaterThan(8),lessThan(8)));//失败
}
}
执行效果如下:
2.关于@Ignore的使用,表示忽略该方法的执行,比如本例中testAdd方法就使用了@Ignore,从运行结果可以看西湖其未执行。该annotation的现实意义在于对于那些没有实现的方法进行标注不予测试,方便模块化管理。
3.关于@Before和@After的使用,他们在每个测试方法的执行之前和执行之后都会各自执行一次。本例中共有2个测试方法,由于使用@Ignore忽略了一个,所以@Before和@After各执行1次,如果执行了2个测试方法,则@Before和@After各执行2次。
4.关于@BeforeClass和@AfterClass的使用,此2方法分别在所有方法执行之前和所有方法执行之后分别执行1次。使用它们的现实意义在于,对于测试一些比较复杂的方法时做一些预处理,比如资源的加载和释放,比如jdbc连接数据库的相关配置就可以使用@BeforeClass和@AfterClass进行预处理,从而优化执行流程,提高测试的效率。值得注意的是二者都是静态方法,即static。
以上即为JUnit常用的annotation,需要根据实际情况进行灵活地选用。