java知识积累——单元测试和JUnit(二)
首先来复习一下几个重要知识点,然后接着进行一些介绍。在上一篇文章中,我曾经贴过下面这张图片:
在Which method stubs would you like to create?这里,现在结合4个标注的含义来说明一下:
@BeforeClass 标注的方法会在类加载的时候执行一次,且仅此一次,该方法必须是public和static的
@AfterClass 标注的方法会在类销毁的时候执行一次,且仅此一次,该方法必须是public和static的
@Before 标注的方法会在每个测试方法执行前先执行一次
@After 标注的方法会在每个测试方法执行结束后执行一次
以上四个标注,对应了那个勾选列表中的四个方法,可以在创建测试类时根据具体情况进行勾选。
在测试过程中,可能需要针对一个方法的不同临界值进行多组数据的测试。下面给出这种情况下的测试方法:
在上一遍文章中的例子 中,Calculator类的square方法需要针对正数、负数、零3种情况进行测试。所以我们如下进行,首先在Calculator类上右键new一 个JUint Test Case,起名为CalculatorSquareTest,然后该类的代码修改如下:
1 package org.logback.test;
2
3 import static org.junit.Assert.*;
4
5 import java.util.Arrays;
6 import java.util.Collection;
7
8 import org.junit.Before;
9 import org.junit.Test;
10 import org.junit.runner.RunWith;
11 import org.junit.runners.Parameterized;
12 import org.junit.runners.Parameterized.Parameters;
13
14 @RunWith(Parameterized. class )
15 public class CalculatorSquareTest {
16
17 private static Calculator example = new Calculator();
18
19 private int param;
20
21 private int result;
22
23 @Parameters//定义测试数据集合,前者param后者result
24 public static Collection data(){
25 return Arrays.asList(new Object[][]{
26 {2,4},
27 {0,0},
28 {-3,9},
29 });
30 }
31
32 @Before
33 public void setUp() throws Exception {
34 example.clear();
35 }
36
37 @Test
38 public void testSquare() {
39 example.square(param);
40 assertEquals(result, example.getResult());
41 }
42
43 //构造函数,对变量进行初始化,注意参数顺序应与定义的测试集合的参数顺序一致
44 public CalculatorSquareTest(int param,int result){
45 this.param = param;
46 this.result = result;
47 }
48
49 }
14行设置了本测试类的运行器为Parameterized.class,因为此类需要多组数据,所以不能采用默认的运行器。
23-30行是定义测试数据集合,此处的2元组数据的顺序要统一,并且与构造函数的参数顺序要一致。
44-47行是构造函数,通过定义的数据集合和构造函数,将要测试的情况传递给测试类,然后进行测试。
也就是说,执行了3次该测试类,依次采用了数据集合中的数据。此例中数据集合的顺序顺序为{处理值,预期处理结果}。
结果如下:
可以看到runs那里是3/3。
OK,此时我们的测试类数量就已经上升为2个了,如果分别运行2个测试类再观察结果可能比较麻烦。或者有人觉得这还不算什么,那要是有10个测试类呢?所以就引出了打包测试的概念,我们可以通过JUnit提供的机制,一次性把之前的2个测试类都执行了。
在Calculator类上右键new一个JUnit Test Case,方法处什么都不勾选,然后点击Finish。将代码改为如下:
1 package org.logback.test;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.Test;
6 import org.junit.runner.RunWith;
7 import org.junit.runners.Suite;
8
9 @RunWith(Suite.class)
10 @Suite.SuiteClasses({
11 CalculatorSquareTest.class,
12 CalculatorTest.class
13 })
14 public class CalculatorAllTest {
15 }
9行指定了此测试类的运行器
10-13行指定了要同时运行哪些测试类
该测试类并无实际实现
下面只要将此类run as JUnit Test即可,得到结果如图所示:
可以发现,我们上一遍文章的测试类,和这篇文章的测试类都同时执行了,并且列出了详细结果。
以上就是我对于JUnit的研究结果,我感觉一般的工作这些技巧就可以应付了,当然如果哪位Geek有更高级方便的用法也欢迎分享。