Junit是一个测试框架,分分钟入门,但它带来的便捷高效是不言而喻的,如果以投入时间和回报的节省时间来算,它的性价比很高。本篇就以一个简单的实例,结合注释,将该框架的基本功能介绍一下。
引入依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
对于一个简单的功能模块,我们可以这样测试:
@Test public void testDemo0() { System.out.println("testDemo0()"); }
在eclipse中,我们可以选中方法名,而后右键Run as Junit Test,这个方法就会运行,执行成功即绿色通过,否则显示红色失败。当出现多个功能模块需要进行测试,比如:
@Test
public void testDemo0() {
int a = 1;
int b = 2;
My my = new My();
int result = my.plus(a, b);
System.out.println("plus测试结果" + result);
}
@Test
public void testDemo1() {
int a = 1;
int b = 2;
My my = new My();
int result = my.minus(a, b);
System.out.println("minus测试结果" + result);
}
如果每个测试方法中,都要进行一些相同的处理,那么我们可以考虑用@Before和@After来进行简化:
private int a; private int b; private int result; private My my; private String func; @Test public void testDemo0() { func = "plus"; result = my.plus(a, b); } @Test public void testDemo1() { func = "minus"; result = my.minus(a, b); } @Before public void myBefore() { a = 1; b = 2; my = new My(); } @After public void myAfter() { System.out.println(func + "测试结果:" + result); }
结果打印:
plus测试结果:3
minus测试结果:-1
这样写是不是清爽很多?当需要预处理和执行完之后处理的内容增多时,这种测试简洁性就会更加明显!这两个注解就是用来对每个方法进行预处理和执行之后处理的,但是当整个测试类一开始只运行一次和结束测试时运行一次又该如何处理呢?答案是@BeforeClass,@AfterClass:
private int a; private int b; private int result; private My my; private String func; @Test public void testDemo0() { func = "plus"; result = my.plus(a, b); } @Test public void testDemo1() { func = "minus"; result = my.minus(a, b); } @Before public void myBefore() { a = 1; b = 2; my = new My(); } @After public void myAfter() { System.out.println(func + "测试结果:" + result); } @BeforeClass public static void myBeforeClass() { System.out.println("准备开始测试了哦:"); } @AfterClass public static void myAfterClass() { System.out.println("所有测试全部结束!"); }
效果:
准备开始测试了哦: plus测试结果:3 minus测试结果:-1 所有测试全部结束!
实际开发中的单元测试里,我们不会用这样的输出来观察它的测试结果,而是用断言,Assert有很多种方法,这里不一一介绍,简单举例:
private int a; private int b; private int result; private My my; private String func; @Test public void testDemo0() { func = "plus"; result = my.plus(a, b); Assert.assertEquals(3, result); } @Before public void myBefore() { a = 1; b = 2; my = new My(); } @After public void myAfter() { System.out.println(func + "测试结果:" + result); }
在断言的assertEquals(expected, actual)中,第一个参数是期望方法结束后设置参数的值,第二个是执行完方法后这个真实的参数,如果二者相等,那么这个测试就算通过,如果不想等,就算失败。另外,@Test还可以使用超时参数timeout,当整个方法体执行完的时间小于这个设置的参数并且断言结果正确时,整个测试方法才算成功,否则就算断言正确,整个方法依然是失败的: