标签:
说起单元测试,刚毕业或者没毕业的人可能大多停留在课本讲述的定义阶段,至于具体是怎么定义的,估计也不会有太多人记得。我们的教育总是这样让人“欣 慰”。那么什么是单元测试呢?具体科学的定义咱就不去关心了,其实每个写代码的人都在时刻进行着单元测试,除非你从来不验证自己写的代码能否达到预期目 的,而是直接写完就完事儿了,连run一下都不进行。
单元测试说的直白一点,就是验证写得一段代码是否正确,可能是一个类,可能是一个函数,甚至可能是一个循环。为了测试的方便,我们一般直接就在写好的可运 行代码中直接进行测试,看到控制台输出了预想的结果或者抛出了异常。但是进入了公司,这样的测试方法极不专业也不不容易复现测试环境。那么可能需要专门写 一个测试类,调用你想测试的代码单元,然后进行测试。但是这样每次都需要新建类,编写测试用例,相当之麻烦。
说了这么多,福利来了。单元测试工具——JUnit。协助我们进行单元测试,提供诸多便利。下面介绍如何在Eclipse中利用JUnit进行单元测试。
假如,我们编写了一个Calculator,提供一些简单的计算器功能。代码如下,故意留一些bug。
1 package org.logback.test;
2
3 public class Calculator {
4
5 private static int result;
6 // 静态变量,用于存储运行结果
7
8 public void add(int n) {
9
10 result = result + n;
11
12 }
13
14 public void substract(int n) {
15
16 result = result - 1; //Bug: 正确的应该是 result = result-n
17
18 }
19
20 public void multiply(int n) {
21
22 } // 此方法尚未实现
23
24 public void divide(int n) {
25
26 result = result / n;
27
28 }
29
30 public void square(int n) {
31
32 result = n * n;
33
34 }
35
36 public void squareRoot(int n) {
37
38 for (; ;) ; //Bug : 死循环
39
40 }
41
42 public void clear() { // 将结果清零
43
44 result = 0;
45
46 }
47
48 public int getResult() {
49
50 return result;
51
52 }
53 }
那么要对这个类在现有开发程度下进行单元测试了,方法很简单,首先在该类所属的工程名上右键进入Properties。
在弹出的Properties窗口,左侧选择Java Build Path,然后右侧选择Libraries标签卡,最后选择Add Library。
在弹出的Add Library窗口中,选择JUnit点击Next,然后在下拉菜单中选择JUnit4,点击Finish。
这样JUnit就被引入了项目的Libraries中,点击OK。在要进行测试的那个类上右键,选择new→JUnit Test Case。
在弹出的新建窗口中按如下设置,具体含义稍后讲解
这里可以选择将测试类放在专门的测试包中,并且给测试类起一个显而易见的名字。选择Next,然后进入了下图。
此处是选择要测试的方法,假如我们只测试加减乘除4个方法,则勾选对应的4个方法,点击Finish。则自动生成了一个测试类,不过我们仍需对此类进行一定的修改,将该测试类最终修改为如下代码
1 package org.logback.test;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.After;
6 import org.junit.AfterClass;
7 import org.junit.Before;
8 import org.junit.BeforeClass;
9 import org.junit.Ignore;
10 import org.junit.Test;
11
12 public class CalculatorTest {
13
14 private static Calculator example = new Calculator();
15
16 @Before//在每个测试方法执行前先执行的方法
17 public void setUp() throws Exception {
18 example.clear();
19 }
20
21 @After//在每个测试方法执行后立刻执行的方法
22 public void setDown(){
23 System.out.println("over");
24 }
25
26 @BeforeClass //在类加载的时候调用的方法,必须public和static的,只调用一次
27 public static void start(){
28 System.out.println("start class");
29 }
30
31 @AfterClass //在类结束的时候调用的方法,必须public和static的,只调用一次
32 public static void destory(){
33 System.out.println("destory class");
34 }
35
36 @Test
37 public void testAdd() {
38 example.add(2);
39 example.add(3);
40 assertEquals(5, example.getResult());
41 }
42
43 @Test
44 public void testSubstract() {
45 example.add(10);
46 example.substract(2);
47 assertEquals(8, example.getResult());
48 }
49
50 @Ignore//因该方法暂未实现而忽略测试
51 @Test
52 public void testMultiply() {
53 fail("Not yet implemented");
54 }
55
56 @Test
57 public void testDivide() {
58 example.add(8);
59 example.divide(2);
60 assertEquals(4, example.getResult());
61 }
62
63 @Test(timeout = 1000)//设置时间限制,单位是毫秒,超时即算测试失败
64 public void testsquareRoot(){
65 example.squareRoot(4);
66 assertEquals(2, example.getResult());
67 }
68
69 @Test(expected = ArithmeticException.class)//测试是否能如期抛出该异常
70 public void divideByZero(){
71 example.divide(0);//除数为0,如能正确抛出异常,则测试通过,否则测试失败
72 }
73 }
标签:
原文地址:http://www.cnblogs.com/felix-/p/4331921.html