JUnit基础及第一个单元测试实例(JUnit3.8)

单元测试

  单元测试(unit testing) ,是指对软件中的最小可测试单元进行检查和验证。

  单元测试不是为了证明您是对的,而是为了证明您没有错误。

  单元测试主要是用来判断程序的执行结果与自己期望的结果是否一致。

  关键是在于所用的测试用例(Test Case)

JUnit

  JUnit是一个Java语言的单元测试框架。

  项目主页:http://junit.org/

  Java的很多IDE,比如Eclipse集成了JUnit,只需要在build path中添加Library并选择想用的版本即可。

  JUnit的两种主要版本是JUnit 3.8和JUnit 4,前者使用反射,后者使用反射和注解。

  博文回顾:本博客上次介绍JUnit的时候是在反射和注解之后:

  http://www.cnblogs.com/mengdd/archive/2013/02/02/2890204.html

  

结合实例来说明单元测试的用法:

1.编写目标类源代码

  新建一个项目,起名叫JUnitTest,首先编写一个目标类Calculator:

package com.mengdd.junit;public class Calculator
{public int add(int a, int b){return a + b;}public int subtract(int a, int b){return a - b;}public int multiply(int a, int b){return a * b;}public int divide(int a, int b){return a / b;}
}

2.添加JUnit库

  然后为了使用JUnit,需要加入库:

  右键选择项目Properties->左侧Java Build Path->标签Libraries->Add Library...

  弹出的对话框中选JUnit,然后Next,再选择JUnit 3或者JUnit 4.

  本文示例选择JUnit 3。

3.创建测试类

  这里需要注意以下几点:

  1.使用JUnit的最佳实践:源代码和测试代码需要分开。

  所以可以新建一个名叫test的source folder,用于存放测试类源代码。这样在发布程序的时候测试类的程序就可以丢掉了。

  但是这两个文件夹中的类编译出的class文件都会在同一个bin文件夹中。

  2.测试类和目标源代码的类应该位于同一个包下面,即它们的包名应该一样。

  这样测试类中就不必导入源代码所在的包,因为它们位于同一个包下面。

  3.测试类的命名规则

  在要测试的类名之前或之后加上Test。

  此步骤完成后项目目录如下:

  

4.测试类代码编写

  测试类必须继承于TestCase类。

  TestCase文档说明:

public abstract class TestCase
extends Assert
implements Test

A test case defines the fixture to run multiple tests.

To define a test case
1) implement a subclass of TestCase
2) define instance variables that store the state of the fixture
3) initialize the fixture state by overriding setUp
4) clean-up after a test by overriding tearDown.
Each test runs in its own fixture so there can be no side effects among test runs.

  (本文最后参考资料中会给出JUnit文档的网盘链接,有需要可下载)

  还有一个很重要的Assert类,参见文档,全是static void方法。

对于测试类中方法的要求:

  在JUnit 3.8中,测试方法需要满足如下原则:

  1.public的。

  2.void的。

  3.无方法参数。

  4.方法名称必须以test开头。 (它通过反射找出所有方法,然后找出以test开头的方法)。

Test Case之间一定要保持完全的独立性,不允许出现任何的依赖关系。

  删除一些方法后不会对其他的方法产生任何的影响。

  我们不能依赖于测试方法的执行顺序。

综上,编写代码如下:

package com.mengdd.junit;import junit.framework.Assert;
import junit.framework.TestCase;public class CalculatorTest extends TestCase
{public void testAdd(){Calculator calculator = new Calculator();int result = calculator.add(1, 2);// 判断方法的返回结果Assert.assertEquals(3, result);// 第一个参数是期望值,第二个参数是要验证的值
    }public void testSubtract(){Calculator calculator = new Calculator();int result = calculator.subtract(1, 2);// 判断方法的返回结果Assert.assertEquals(-1, result);// 第一个参数是期望值,第二个参数是要验证的值
}public void testMultiply(){Calculator calculator = new Calculator();int result = calculator.multiply(2, 3);// 判断方法的返回结果Assert.assertEquals(6, result);// 第一个参数是期望值,第二个参数是要验证的值
}public void testDivide(){Calculator calculator = new Calculator();int result = calculator.divide(12, 3);// 判断方法的返回结果Assert.assertEquals(4, result);// 第一个参数是期望值,第二个参数是要验证的值
}}

  运行一下:右键选择该类,Run As->JUnit Test

  (可以在此处右键选择Run重复运行)

  JUnit的口号:Keep the bar green to keep the code clean.

5.代码重构:setUp()方法的使用

  有一个原则:DRY(Don’t Repeat Yourself)

  所以对代码进行重构,将重复的生成对象的部分放在setUp()方法中。

  (重写的时候将protected变为public,继承的时候扩大访问范围是没有问题的。)

  先进行一个方法的测试测试:

  在CalculatorTest类中加入代码如下:

    @Overridepublic void setUp() throws Exception{System.out.println("set up");}@Overridepublic void tearDown() throws Exception{System.out.println("tear down");}

  再次运行后发现Console中输出如下:

  说明这两个方法执行了多次。

  在每个测试用例之前执行setUp(),每个测试用例执行之后,tearDown()会执行。

  即对于每个测试用例,执行顺序为:

  1.setUp()

  2.testXXX()

  3.tearDown()

  重构:使用成员变量生成对象(为了能在每个方法中都用到),将生成对象的语句放在setUp()中,注意这里为每一个测试用例都会生成新的对象。

  重构后代码如下:

package com.mengdd.junit;import junit.framework.Assert;
import junit.framework.TestCase;public class CalculatorTest extends TestCase
{private Calculator calculator = null;@Overridepublic void setUp() throws Exception{System.out.println("set up");// 生成成员变量的实例calculator = new Calculator();System.out.println(calculator);}@Overridepublic void tearDown() throws Exception{System.out.println("tear down");}public void testAdd(){int result = calculator.add(1, 2);// 判断方法的返回结果Assert.assertEquals(3, result);// 第一个参数是期望值,第二个参数是要验证的值
    }public void testSubtract(){int result = calculator.subtract(1, 2);// 判断方法的返回结果Assert.assertEquals(-1, result);// 第一个参数是期望值,第二个参数是要验证的值
}public void testMultiply(){int result = calculator.multiply(2, 3);// 判断方法的返回结果Assert.assertEquals(6, result);// 第一个参数是期望值,第二个参数是要验证的值
}public void testDivide(){int result = calculator.divide(12, 3);// 判断方法的返回结果Assert.assertEquals(4, result);// 第一个参数是期望值,第二个参数是要验证的值
}}

  运行后控制台输出:

  说明每一个测试的方法前后都会有setUp()和tearDown()方法的调用,所以每次生成的都是一个新的对象,各个方法之间没有干扰

参考资料

  圣思园张龙老师Unit Test系列视频教程。

  CHM格式文档网盘链接:

  JUnit 3.8.1:http://pan.baidu.com/share/link?shareid=539342&uk=2701745266

  JUnit 4.0:http://pan.baidu.com/share/link?shareid=539345&uk=2701745266

转载于:https://www.cnblogs.com/mengdd/archive/2013/03/26/2983565.html

JUnit基础及第一个单元测试实例(JUnit3.8)相关推荐

  1. JUnit基础及第一个单元测试实例

    单元测试 单元测试(unit testing) ,是指对软件中的最小可测试单元进行检查和验证. 单元测试不是为了证明您是对的,而是为了证明您没有错误. 单元测试主要是用来判断程序的执行结果与自己期望的 ...

  2. Python学习-基础篇14 Web框架本质及第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  3. Flutter基础—第一个Flutter实例

    学习Flutter的第一个实例: import 'package:flutter/material.dart'; void main() {runApp(new Center(child: new T ...

  4. Mybatis入门概述及第一个Mybatis实例实现增删改查

    林炳文Evankaka原创作品.转自https://blog.csdn.net/Evankaka/article/details/45647401 一.简介 1.什么是MyBatis MyBatis ...

  5. 乐高中的第一个C语言编程,Robotc for EV3 配置及第一个小实例

    本帖最后由 jiangzian 于 2018-9-21 10:12 编辑 下载安装好之后,您需要遵循几个步骤才能制作一个新的,开箱即用的EV3'ROBOTC-Ready'. 一.软件界面 ROBOTC ...

  6. 【单元测试】Junit 4(二)--eclipse配置Junit+Junit基础注解

    1.0 前言 ​ 前面我们介绍了白盒测试方法,后面我们来介绍一下Junit 4,使用的是eclipse(用IDEA的小伙伴可以撤了) 1.1 配置Junit 4 1.1.1 安装包 我们需要三个jar ...

  7. 用JUnit框架实现Java单元测试

    http://tech.it168.com/j/2007-08-27/200708271737659.shtml 单元测试是整个测试流程中最基础的部分,它们要求程序员尽可能早地发现问题,并给予控制,这 ...

  8. 【Java 强化】单元测试(JUnit3、JUnit4)、XML(语法、约束、文档结构)、DOM、DOM4J

    Java 强化 软件测试 黑盒测试:软件测试工程师 白盒测试:软件开发工程师 单元测试(JUnit3.JUnit4) 使用 junit3.x(了解) 使用 junit4.x(掌握) 使用断言方式(了解 ...

  9. Javaspring 1-6课 基本概念及第一个Javaspring程序

    只会前端还是差点事,开坑后端.参照教程为http://c.biancheng.net/spring/ 首先Javaspring是一个框架,之前一直没搞明白什么是框架,现在的理解框架就是毛坯房,已经设计 ...

最新文章

  1. 事务的应用demo1-------采用JDBC硬编码方式模拟银行转账。
  2. Mac下制作Ubuntu的启动U盘
  3. Pandas对象的层次化索引——【from_tuples()、from_arrays()、from_product()、swaplevel()、sort_index()、sort_values()】
  4. ubantu下清除项目缓存的方法
  5. POJ1182 食物链【并查集】
  6. python基础知识——函数(中)
  7. 吃鸡 反作弊服务器未运行,绝地求生反作弊服务(BE)修复工具
  8. Fedora CoreOS
  9. MT7628KN/MT7628AN处理器区别解析,参数对比
  10. 人工智能产品经理如何面对数据挖掘
  11. vue中使用highCharts的drilldown钻取图、3D等图
  12. JavaScript查找最长的公共前缀
  13. 网站seo优化方式途径
  14. 普适计算-2014/02/28
  15. 干货!基于元消歧的偏多标记学习
  16. Jetson部署实践
  17. XMLHttpRequest简介
  18. EE308 LAB2
  19. 华为认证考试一定要去报培训班吗?
  20. 适用于射频器件生产厂家的自动化测试软件

热门文章

  1. mysql dump 到的文件_mysql查询结果导出到文件
  2. x86架构手机_都是芯片,为什么电脑CPU不能用在手机里?
  3. ensp删除静态路由命令_eNSP配置静态路由
  4. linux 压缩文件夹格式,Linux下常见文件格式的压缩、解压小结
  5. oracle查询不走索引全表扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景-Oracle...
  6. C++:随笔2--I/O实践
  7. Python+OpenCV创建级联文件(Windows7/10环境)
  8. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集
  9. C++中的双冒号(::)
  10. Matlab中的lsqcurvefit函数的使用