JUnit的annotation

来源:互联网 发布:珠光色眼影推荐知乎 编辑:程序博客网 时间:2024/05/30 07:14

前面已经写过一个例子了,但是那个例子只是入门,本例主要说说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 */@BeforeClasspublic static void beforeClass(){System.out.println("BeforeClass");}/** * 在所有方法之后执行 * @Title: afterClass  * @Description: TODO  * @return void   * @author yuan * @date 2016-4-13下午9:36:45 */@AfterClasspublic static void afterClass(){System.out.println("AfterClass");}/** * 在每个方法执行之前执行 * @Title: before  * @Description: TODO  * @return void   * @author yuan * @date 2016-4-13下午9:37:02 */@Beforepublic void before(){System.out.println("Before");}/** * 在每个方法执行之后执行 * @Title: after  * @Description: TODO  * @return void   * @author yuan * @date 2016-4-13下午9:37:42 */@Afterpublic void after(){System.out.println("After");}/** * 测试 * @Title: testAdd  * @Description: TODO  * @return void   * @author yuan * @date 2016-4-12下午9:52:19 */@Ignore//此方法被忽略,不执行@Testpublic 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,需要根据实际情况进行灵活地选用。



1 0