瘦鱼-博客

Junit的使用

  在java中,单元测试是指类的测试,重点是测试类中的方法是否按照设计的逻辑运行。一个测试用例主要有以下步骤:

  1. 输入参数。方法需要的参数。
  2. 期待值。方法是自己设计的,对于输入,自己知道应该输出什么。
  3. 实际值。方法使用输入参数后实际上输出的值。
  4. 断言,判断期待值和实际值是否相等。使用断言判断期待值和实际值是否相等,不相等则会抛出异常,测试失败。

  测试大概可以分为两类:无依赖和有依赖的。无依赖,是指要测试类不再依赖其他自己要编写的类,主要是工具类。可以直接使用Junit测试。有依赖,是指存在调用关系,例如Service层调用DAO。对于这种测试,需要进行隔离,就是说当前只测试Service层,那么默认为DAO层是可以正常工作的,对于DAO层的方法需要进行模拟。一般用的框架有Mocktio、EasyMock、PowerMock。  

  Junit是用于编写单元测试的框架。对于已经写好的函数,可以使用Junit生成单元测试代码。

  自己的环境是:Linux

  Java环境是:JDK1.7

  IDE:Eclipse Java EE IDE for Web Developers.Version: Mars.2 Release (4.5.2) Build id: 20160218-0600

使用步骤

1、新建项目,命名为JUnit_Test,编写了一个用于计算的类:Calcutor,代码中故意留下一些问题,便于测试。代码如下:

 1 package com.test.unit;
 2 
 3 public class Calculator{
 4 
 5     // 加法
 6     public int add(int a, int b){
 7         return a + b;
 8     }
 9 
10     // 减法
11     public int substract(int a, int b){
12         return a + b; // Bug: 正确的应该是a-b
13     }
14 
15     // 乘法
16     public int multiply(int a, int b) {
17         try{
18             Thread.sleep(300);//用于性能测试
19         }catch (InterruptedException e){
20             // TODO Auto-generated catch block
21             e.printStackTrace();
22         }
23         return a * b;
24     }
25 
26     // 除法
27     public int divide(int a, int b) throws ArithmeticException{
28         if (b == 0){
29             throw new ArithmeticException();
30         }
31         return a / b;
32     }
33 
34     // 平方根
35     public void squareRoot(int n) {
36         for (;;)
37             ; // Bug : 死循环
38     }
39 }

 

2、引入Junit库。选中项目,右键——Build Path——Add Libraries,选择JUnit,引入的包如下:









3、生成测试类。选中 Calcutor.java,右键——New——JUnit Test Case




















选择setUp,再下一步,选择要进行测试的方法,及生成了选择的函数的测试用例,再根据需要自己编写代码。

主要测试类型有三种:

  (1)常规的计算测试。调用函数计算值,输入自己期望的值,以及出错信息。如果调用函数计算的值与自己期望的值不相等,则抛出出错信息。

  (2)用于性能测试。要让一个方法,200毫秒里运行完,如果这个方法200毫秒不能运行完,那么这个方法就应该抛出异常。

  (3)异常测试。期待抛出异常,如果没有抛出异常,则报错。

测试代码如下:

 1 package com.test.unit;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Before;
 6 import org.junit.Test;
 7 
 8 public class CalculatorTest{
 9 
10     Calculator cal;
11 
12    //每个方法执行前会执行
13     @Before
14     public void setUp() throws Exception{
15         cal = new Calculator();
16     }
17 
18     //测试方法,以test开始
19     @SuppressWarnings("deprecation")
20     @Test
21     public void testAdd(){
22         int rel = cal.add(10, 5);//调用函数计算的值
23         assertEquals("加法有问题", 15, rel);//传入计算的值,自己期望的值,出错信息
24     }
25 
26     @Test
27     public void testSubstract(){
28         int rel = cal.substract(20, 5);
29         assertEquals("减法有问题", 16, rel);
30     }
31 
32     // 用于性能测试
33     // 要让一个方法,200毫秒里运行完,如果这个方法200毫秒不能运行完,那么这个方法就应该抛出异常
34     @Test(timeout = 200)
35     public void testMultiply(){
36         int rel = cal.multiply(2, 4);
37         assertEquals("乘法有问题", 8, rel);
38     }
39 
40     //异常测试
41     @Test(expected = ArithmeticException.class)
42     public void testDivide(){
43         int rel = cal.divide(10, 0);
44         assertEquals("除法有问题", 5, rel);
45     }
46 
47 }

 

4、完成测试代码的编写后,包管理器中选中CalculatorTest,右键——Run as——JUnit Test,进行测试,测试结果如下:
























 

根据报错信息再修改自己的代码。

 

其他注解

 

 @Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,咱不参与此次测试”;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应的函数,只需要把 @Ignore 注解删除即可,就可以进行正常测试了。当然,这个 @Ignore 注解对于像我这样有“强迫症”的人还是大有意义的。每当看到红色条(测试失败)的时候就会全身不舒服,感觉无法忍受(除非要测试的目的就是让它失败)。当然,对代码也是一样,无法忍受那些杂乱不堪的代码。

 

@BeforeClass:针对所有测试,也就是整个测试类中,在所有测试方法执行前,都会先执行由它注解的方法,而且只执行一次。当然,需要注意的是,修饰符必须是 public static void xxxx ;此 Annotation 是 JUnit 4 新增的功能。

 

@AfterClass:针对所有测试,也就是整个测试类中,在所有测试方法都执行完之后,才会执行由它注解的方法,而且只执行一次。当然,需要注意的是,修饰符也必须是 public static void xxxx ;此 Annotation 也是 JUnit 4 新增的功能,与 @BeforeClass 是一对。

 

posted @ 2016-12-05 21:26  瘦鱼  阅读(373)  评论(0编辑  收藏  举报