在java中,单元测试是指类的测试,重点是测试类中的方法是否按照设计的逻辑运行。一个测试用例主要有如下步骤:java
测试大概能够分为两类:无依赖和有依赖的。无依赖,是指要测试类再也不依赖其余本身要编写的类,主要是工具类。能够直接使用Junit测试。有依赖,是指存在调用关系,例如Service层调用DAO。对于这种测试,须要进行隔离,就是说当前只测试Service层,那么默认为DAO层是能够正常工做的,对于DAO层的方法须要进行模拟。通常用的框架有Mocktio、EasyMock、PowerMock。 框架
Junit是用于编写单元测试的框架。对于已经写好的函数,可使用Junit生成单元测试代码。ide
本身的环境是: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,引入的包以下:ui
3、生成测试类。选中 Calcutor.java,右键——New——JUnit Test Casespa
选择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 是一对。