使用JUnit4

[b]一、介绍[/b]
JUnit4 基本上是一个新框架,而不是旧框架的升级版本。其主要目标便是利用Java 5的Annotation特性简化测试用例的编写。要求:JDK 5.0或以上版本。
[b]二、用法[/b]
1、Junit3中,Junit依赖反射来执行每个以test开头的方法,但是Junit4中,有了Annotation的,我们的测试方法就不需要再以testXXX来标识了,而是写上一个@Test标注即可。如:

@Test
public static void method() {}

说明:
(1)、测试方法必须使用注解 org.junit.Test 修饰。
(2)、测试方法必须使用 public void 修饰,而且不能带有任何参数。
2、测试类也不必继承自TestCase了。可能会想,不继承TestCase,我们就无法使用断言,即无法调用assertXxx()方法了。所以,在Junit4中,所有的断言的方法全部都以静态方法的形式放入到了Assert类中,使用Assert.assertXxx()来调用,如果使用import static静态导入Assert,那么与Junit3中使用断言是一样的。

3、Junit3中,setUp()和tearDown()方法分别是准备测试环境和释放资源,在Junit4中,这二个方法依赖于@Before和@After标记,好处是如果我们忘记了在这二个方法中调用父类的同名方法,Junit框架会自动处理使用@Before和@After标记的方法。,@Before表示每个测试方法执行前执行一次,而@BeforeClass表示整个类测试前执行一次。

4、不再强迫必须使用setUp()和tearDown()作为方法名,可以使用更有意义的方法名。如:init()和close(),前提是它们被标注了@Before和@After标记。

5、对测试异常,JUnit 4可以用expected=Exception.class来期待一个预期的异常,而不必手动编写。参数 expected 代表测试方法期望抛出指定的异常,如果运行测试并没有抛出这个异常,则 JUnit4 会认为这个测试没有通过。如:

public int div(int a,int b){
return a / b;
}

可能会抛出除数为0的异常,可以这样来编写:

@Test(expected=ArithmeticException.class)
public void testDiv(){
cal.div(5, 0);
}


@Test(expected = NullPointerException.class)
public void unsupportedDBCheck() {
throw new NullPointerException();
}

6、设置最长执行时间
参数timeout,指定被测试方法被允许运行的最长时间应该是多少,如果测试方法运行时间超过了指定的毫秒数,则JUnit认为测试失败。

@Test(timeout=1)
public void testMinus(){
assertEquals(cal.minus(2, 1), 1);
}

7、Ignore 用于暂时忽略某个测试方法,因为有时候由于测试环境受限,并不能保证每一个测试方法都能正确运行。

@Ignore("db is down")
@Test(expected=UnsupportedDBVersionException.class)
public void unsupportedDBCheck(){

}

8、类级别的Fixture设置方法
注解@BeforeClass修饰用于初始化Fixture的方法。注解@AfterClass 修饰用于注销Fixture的方法。由于这二个方法在运行其间仅执行一次,因此它们只能标记为静态方法(使用 public static void 修饰,而且不能带有任何参数),其实在所有的测试方法中共享的资源也必须是静态引用。如:

//类级别Fixture初始化方法
@BeforeClass
public static void dbInit(){
}

//类级别Fixture注销方法
@AfterClass
public static void dbClose(){
}

类级别的Fixture方法,仅会在测试类中所有测试方法执行之前执行初始化,并在全部测试方法测试完毕之后执行注销方法。
9、测试运行机
JUnit 中所有的测试方法都是由它负责执行的。JUnit 为单元测试提供了默认的测试运行器,但 JUnit 并没有限制您必须使用默认的运行器。相反,您不仅可以定制自己的运行器(所有的运行器都继承自 org.junit.runner.Runner),而且还可以为每一个测试类指定使用某个具体的运行器。指定方法也很简单,使用注解 org.junit.runner.RunWith 在测试类上显式的声明要使用的运行器即可:

@RunWith(CustomTestRunner.class)
public class TestWordDealUtil{

}

10、测试套件
JUnit 提供了一种批量运行测试类的方法,叫做测试套件。这样,每次需要验证系统功能正确性时,只执行一个或几个测试套件便可以了。测试套件的写法非常简单,需要遵循以下规则:
(1)创建一个空类作为测试套件的入口。
(2)使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。
(3)将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。
(4)将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。
(5)保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数。

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({TestWordDealUtil.class,xxx.class})
public class RunAllUtilTestsSuite {

}

测试套件中不仅可以包含基本的测试类,而且可以包含其它的测试套件,这样可以很方便的分层管理不同模块的单元测试代码。但是,您一定要保证 测试套件之间没有循环包含关系。
11、参数化测试
(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。
(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据。
(3)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。
(4)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
(5)编写测试方法,使用定义的变量作为参数进行测试。

@RunWith(Parameterized.class)
public class TestWordDealUtilWithParam {

private String expected;
private String target;

@Parameters
public static Collection words(){
return Arrays.asList(new Object[][]{
{"employee_info", "employeeInfo"}, //测试一般的处理情况
{null, null}, //测试 null 时的处理情况
{"", ""}, //测试空字符串时的处理情况
{"employee_info", "EmployeeInfo"}, //测试当首字母大写时的情况
{"employee_info_a", "employeeInfoA"}, //测试当尾字母为大写时的情况
{"employee_a_info", "employeeAInfo"} //测试多个相连字母大写时的情况
});
}

/**
* 参数化测试必须的构造函数
* @param expected 期望的测试结果,对应参数集中的第一个参数
* @param target 测试数据,对应参数集中的第二个参数
*/
public TestWordDealUtilWithParam(String expected , String target){
this.expected = expected;
this.target = target;
}

/**
* 测试将 Java 对象名称到数据库名称的转换
*/
@Test
public void wordFormat4DB(){
assertEquals(expected, WordDealUtil.wordFormat4DB(target));
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值