JUnit 4全面引入了Annotation来执行我们编写的测试。JUnit 4并不要求测试类继承TestCase父类。在一个测试类中,所有被@Test注解所修饰的public,void方法都是test case(测试用例),可以被JUnit所执行。
虽然JUnit 4并不要求测试方法名以test开头,但我们最好还是按照JUnit 3.8的要求那样,以test作为测试方法名的开头。
在JUnit 4中,通过@Before注解实现与JUnit 3.8中的setUp方法同样的功能,通过@After注解实现与JUnit 3.8中的tearDown方法同样的功能。
在JUnit 4中,可以使用@BeforeClass与@AfterClass注解修饰一个public static void no-arg的方法,这样被@BeforeClass注解所修饰的方法会在所有测试方法执行前执行,在所有方法执行之前只执行一次;被@AfterClass注解所修饰的方法会在所有测试方法执行之后执行,在所有方法执行之后只执行一次.
public class CaculatorTest {
private Caculator caculator;
@BeforeClass
public static void init(){
System.out.println("init");
}
@AfterClass
public static void des(){
System.out.println("des");
}
@Before
public void setUp(){
caculator=new Caculator();
System.out.println("setUP");
}
@After
public void tearDown(){
System.out.println("tear down");
}
@Test(timeout=200)
public void testAdd(){
int result=caculator.add(2,3);
Assert.assertEquals(5,result);
}
@Test
public void testSubtract(){
int result=caculator.subtract(3,4);
Assert.assertEquals(-1,result);
}
@Test
public void testMultpli(){
int reuslt=caculator.multpli(3,4);
Assert.assertEquals(12,reuslt);
}
@Test(expected=Exception.class)
public void testDiv()throws Exception{
int result=caculator.div(5,0);
}
}
@Ignore注解可用于修饰测试类与测试方法,当修饰测试类时,表示忽略掉类中的所有测试方法;当修饰测试方法时,表示忽略掉该测试方法。注意的是要在@Test声明之后用@Ignore
@Test(expected=Exception.class)
@Ignore
public void testGetLargest3() throws Exception{
ma.getLargest(new int[]{});
}
junit4中的运行器:
三个运行器:内置的,当不用@RunWith时用的是eclipse的,parameterized即参数化运行器,Suite运行器,即测试套件运行器.
参数化测试(Parameters):当一个测试类使用参数化运行器运行时,需要在类的声明处加上@RunWith(Parameterized.class)注解,表示该类将不使用JUnit内建的运行器运行,而使用参数化运行器运行;在参数化运行类中提供参数的方法上要使用@Parameters注解来修饰,同时在测试类的构造方法中为各个参数赋值(构造方法是由JUnit调用的),最后编写测试类,它会根据参数的组数来运行测试多次。
@RunWith(Parameterized.class)
public class ParameterizedTest {
private int excepted;
private int input1;
private int input2;
private Caculator cal;
@Before
public void setUp(){
cal=new Caculator();
}
@Parameters
public static Collection initData(){
Object[] obj=new Object[][]{{2,1,1},{6,4,2},{9,2,7},{-4,-3,-1}};
return Arrays.asList(obj);
}
public ParameterizedTest(int excepted,int input1,int input2){
this.excepted=excepted;
this.input1=input1;
this.input2=input2;
}
@Test
public void testAdd(){
Assert.assertEquals(this.excepted,cal.add(input1,input2));
}
}
在JUnit 4中,如果想要同时运行多个测试,需要使用两个注解:@RunWith(Suite.class)以及@Suite.SuiteClasses(),通过这两个注解分别指定使用Suite运行器来运行测试,以及指定了运行哪些测试类,其中的@SuiteClasses中可以继续指定Suite,这样JUnit会再去寻找里面的测试类,一直找到能够执行的Test Case并执行之。
@RunWith(Suite.class)
@SuiteClasses({TestAll.class,CaculatorTest.class,MaxArrayTest.class})
public class TestAll2 {
}
两个运行器都可以参看参考文档