Junit的使用
在java中,单元测试是指类的测试,重点是测试类中的方法是否按照设计的逻辑运行。一个测试用例主要有以下步骤:
- 输入参数。方法需要的参数。
- 期待值。方法是自己设计的,对于输入,自己知道应该输出什么。
- 实际值。方法使用输入参数后实际上输出的值。
- 断言,判断期待值和实际值是否相等。使用断言判断期待值和实际值是否相等,不相等则会抛出异常,测试失败。
测试大概可以分为两类:无依赖和有依赖的。无依赖,是指要测试类不再依赖其他自己要编写的类,主要是工具类。可以直接使用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 是一对。