JUnit简单使用教程
Demo如下:
@RunWith(Parameterized.class)
public class SquareTest {
private static Calculator calculator = new Calculator();
private int param;//参数
private int result;//期望值
// 准备数据
@Parameters
public static Collection data() {
return Arrays.asList(new Object[][]{{2, 4},{0, 0},{-3, 9}});
}
//构造函数,对变量进行初始化
public SquareTest(int param, int result) {
this.param = param;
this.result = result;
}
@Test
public void square() {
calculator.square(param);
assertEquals(result, calculator.getResult());
}
}
打包测试
在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类。可是这些测试类必须一个一个的执行,也是比较麻烦的事情。鉴于此,JUnit为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性的运行完毕,大大的方便了我们的测试工作。具体代码如下:
@RunWith(Suite.class)
@Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class})
public class AllCalculatorTests{
}
大家可以看到,这个功能也需要使用一个特殊的Runner,因此我们需要向@RunWith注解传递一个参数Suite.class。同时,我们还需要另外一个注解@Suite.SuiteClasses,来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该注解可以了。有了这两个注解之后,已经完整的表达了所有的含义,因此下面的类已经无关紧要,随便起一个类名,内容全部为空既可。
异常测试
在JUnit 4之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,可以通过@Test 注解中的expected属性来测试异常。expected属性的值是一个异常的类型。
Demo如下:
@Test(expected=ArithmeticException.class)
public void testDivide() {
new Calculator().divide(6, 0);
}
测试
对于那些逻辑很复杂,循环嵌套比较深的程序,很有可能出现死循环,因此一定要采取一些预防措施。测试是一个很好的解决方案。我们给这些测试方法设定一个执行时间,超过了这个时间,他们会被系统强行终止,并且系统还会向你汇报该方法结束的原因是因为超时,这样你可以发现这些Bug了。要实现这一功能,只需要给@Test 注解加一个timeout属性,该注解传入了一个时间(毫秒)给测试方法,如果测试方法在指定的时间之内没有运行完,则测试失败。
Demo如下:
@Test(timeout=1000)
public void testDeathLoop() {
new Calculator().deathLoop();
}
单元测试运行结果:java.lang.Exception: test timed out after 1000 milliseconds
at test.Calculator.deathLoop(Calculator.java:25)
at test.CaculatorTest.testDeathLoop(CaculatorTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
…………………………