标注说明:
@Before:
使用了该元数据的方法在每个测试方法执行之前都要执行一次。
@After:
使用了该元数据的方法在每个测试方法执行之后要执行一次。
注意:@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDown方法,当然你还可以继续叫这个名字,不过JUnit不会霸道的要求你这么做了。
@Test(expected=*.class)
在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型
@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。
@ignore:
该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@Ignore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。
@BeforeClass:
只在测试用例初始化时执行方法
@AfterClass:
当所有测试执行完毕之后,执行进行收尾工作。
注意:每个测试类只能有一个方法被标注为@BeforeClass 或 @AfterClass,并且该方法必须是Public和Static的。
@RunWith:
标注类前面,用于对后面的类指定运行器,形式@RunWith(**.class),其中的参数为一个类名,表述指定的运行器,这个运行器可以是Junit框架中的运行器,也可以是用户自定义的。
打包测试:
@RunWith:标注传递一个参数Suite.class,注解告诉JUnit它使用org.junit.runner.Suite。这个运行机允许你手工地构建一个包含测试(可能来自许多类)的测试集。这些类的名称都被定义在@Suite.SuiteClass中。
@Suite.SuiteClasses:
来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。
有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,随便起一个类名,内容全部为空既可。
Junit中的失败情况:
JUnit 将测试失败的情况分为两种:failure和error。Failure 一般由单元测试使用的断言方法判断失败引起,它表示在测试点发现了问题;而error则是由代码异常引起,这是测试目的之外的发现,它可能产生于测试代码本身的错误(测试代码也是代码,同样无法保证完全没有缺陷),也可能是被测试代码中的一个隐藏的bug。
参数化测试(Parameters):
当一个测试类使用参数化运行器运行时,需要在类的声明处加上@RunWith(Parameterized.calss)注释,来制定参数化运行器来运行;在参数化运行类中,提供参数的方法要用@Parameters注释来修饰,同时在测试类构造方法中为各个参数赋值(构造方法是由Junit来调用),最后编写测试方法,执行是会根据参数组数来运行测试多次。
实例:数字运算小程序MathDemo
MathDemo.java
package MathDemo;
public class MathDemo {
public int add(int a, int b) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return a + b;
}
public int div(int a, int b) {
if (b == 0)
throw new ArithmeticException("除数不能为零");
return a / b;
}
}
MathDemoTest.java
package MathDemo; import static org.junit.Assert.*; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class MathDemoTest4 { MathDemo demo; @BeforeClass public static void setupBeforeClass() throws Exception { System.out.println("beforeclass..........."); } @Before public void setUp() throws Exception { demo = new MathDemo(); System.out.println("setup..........."); } @After public void tearDown() throws Exception { System.out.println("teatdown..........."); } @AfterClass public static void testAddAfterClass() throws Exception { System.out.println("afterclass........."); } @Test(timeout =500) public void testAdd() { System.out.println("test............."); int a = 4, b = 2; int expected = 6, actual; actual = demo.add(a, b); assertEquals(expected, actual); } @Ignore("该方法还没有实现") public void testDiv() { int a = 4, b = 2; int expected = 6, actual; actual = demo.add(a, b); assertEquals(expected, actual); } @Test(expected = ArithmeticException.class) public void testDiv1() { int a = 4, b = 0; int expected = 4, actual; actual = demo.div(a, b); assertEquals(expected, actual); }
结果:
beforeclass........... setup........... test............. teatdown........... setup........... teatdown........... afterclass.........