当前位置: 首页 > 编程日记 > 正文

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

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

单元测试

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

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

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

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

JUnit

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

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

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

  JUnit的两种主要版本是JUnit 3.8JUnit 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

相关文章:

Scratch青少年编程能力等级测试模拟题(三级)

青少年编程竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

Qt 程序在 Windows 下的发布

「博客搬家」 原地址: CSDN 原发表时间: 2016-06-04本文讨论在 Windows 平台下编译成功的 Qt 程序,如何在未配置 Qt 开发环境的 Windows 平台下独立运行的方法。 经过验证发现,在 Ubuntu 平台下编译成功的程序可在未安装 Qt 开发环境下的 Ubuntu16.04 中…

楷书书法规则_硬笔书法入门学习“三步法”,让练字不再难

生活中,常常有人肯于吃苦,坚持经常练习硬笔书法,但却进步不大,收获甚微。因此,凡有志学好硬笔书法的人,必须掌握一些学习硬笔书法的方法。硬笔书法学习的方法可以采用“三步法”。一、规范入门硬笔一般比较短小灵硬&am…

系统异常设计规范与原则

为什么80%的码农都做不了架构师?>>> 1.系统异常设计的出发点: 良好的异常信息展示,开发运维人员能快速定位问题。响应外部调用异常时,应能明确指明是内部异常还是调用条件不满足导至。响应用户操作异常时,…

陈长沙:学习者参考手册

学习者参考手册 组队学习的核心是“和一群有意思的人在一起学感兴趣的知识的过程,这个过程充满了人与人之间的交流互动,是融入社交属性和学习属性的过程”。作为参与组队学习活动的学习者,一定想了解有关该项活动的各种环节。于是&#xff0…

TC配置文件WCMD.INI详解,只能在ini重修改的配置

有*的项目扩展了功能,有★的项目是只能在INI中修改的配置。 ★Allowed 允许访问哪些驱动器(\代表网络邻居)。例如写为Allowedcde\,代表仅允许访问C、D、E和网络邻居,其余驱动器无法访问,也不会出现在驱动…

mapgis矢量化怎么打分数_mapgis矢量化的详细工作流程

感觉不错就麻烦评下分哦1、准备光栅文件,启动MAPGIS输入编辑子系统,新建工程、新建控制点、界址点、线层等项目文件,建立界址点文件和线层文件的属性结构;2、采集控制点,记录图幅左下角经纬度,保存项目、工…

AutoFac使用方法总结:Part I

utoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系。在使用方面主要是register和resolve两类操作。 这篇文章用单元测试的形式列举了AutoFac的常用使用方法: 注册部分 使用RegisterType进行注册 [Fact]public void can_resolve_myclass…

canvas烟花锦集

canvas可以实现不同动画效果&#xff0c;本文主要记录几种不同节日烟花效果实现。 原文链接 实现一 效果地址 html <canvas id"canvas"></canvas>css body {background: #000;margin: 0; }canvas {cursor: crosshair;display: block; }js // when animat…

【青少年编程(第29周)】8月份的青少年编程组队学习结营了!

2021年09月05日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第二十九次直播活动。我们直播活动的主要内容如下&#xff1a; 首先&#xff0c;我们奖励了上周测试超过60分的小朋友。 其次&#xff0c;我们一起观看了电子学会等级测试流程的视频。 再…

led伏安特性实验误差分析_检测实验室误差分析知识汇编

2019-12-20 09:56:10 来源: 检测实验室误差分析知识汇编-检测家第一部分 误差理论简介在日常检测工作中&#xff0c;我们虽然有最好的检验方法、有检定合格的仪器设备、有满足检验要求的环境条件和熟悉检验工作的操作人员&#xff0c;但是&#xff0c;得到的检验结果却往往不可…

从Qcheck 1.3 不能在不同操作系统上运行问题(chro124、chro342)说开来------

【本文重在技巧学习&#xff0c;授人以鱼&#xff0c;不如授人以渔&#xff01;&#xff01;&#xff01;】 因为公司项目需要对带宽占用进行测试&#xff0c; 最近看电子工业出版社《网络管理工具使用详解》就qcheck 1.3 不能在不同的操作系统之间运行做一个总结。 本文以标题…

Spark笔试

1.Spark 的四大组件下面哪个不是 (D ) A.Spark Streaming B Mlib C Graphx D Spark R 2.下面哪个端口不是 spark 自带服务的端口 (C ) A.8080 B.4040 C.8090 D.18080 3.spark 1.4 版本的最大变化 (B ) A spark sql Release 版本 B 引入 Spark R C DataFrame D支持动态资源…

秦州:西瓜书 + 南瓜书 吃瓜系列 10. 集成学习(下)

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 航路开辟者&#xff1a;谢文睿、秦州开源内容&#xff1a;https://githu…

iar定义arm版本_IAR Systems发布 IAR Embedded Workbench for ARM新版本

IAR Systems发布IAR Embedded Workbench for ARM嵌入式开发平台最新版本V5.41。相比于之前的版本&#xff0c;新版本软件在支持Cortex-M0上&#xff0c;将代码大小和执行速度这两个重要性能都提高了13%。本文引用地址&#xff1a;http://www.eepw.com.cn/article/106054.htmNXP…

UVA10110 Light, more light

链接地址。 分析&#xff1a; 如果n能被a整除&#xff0c;那么一定存在一个b使得a*b n。开关经两次变化相当于没有变化。那么只要看a b的那种特殊情况就OK了。 #include <stdio.h> #include <math.h> #include <stdlib.h>int main(){unsigned n, k;while(s…

【组队学习】【29期】Datawhale组队学习内容介绍

第29期 Datawhale 组队学习活动马上就要开始啦&#xff01; 本次组队学习的内容为&#xff1a; 编程实践&#xff08;数据可视化&#xff09;计算机视觉自然语言处理之情感分析吃瓜教程——西瓜书南瓜书李宏毅机器学习&#xff08;含深度学习&#xff09;动手学数据分析集成学…

json的简单的数据格式

json的简单数据格式 var arr{"obj1":["张三","12","女"],"obj2":["李四","12","女"],"obj3":["王五","12","女"],} var str""; $.each(a…

eplise怎么连接数据库_基于手机信令的大数据分析教程(一)数据导入数据库

前言该套教程以一个初学大数据的菜鸟视角&#xff0c;编写数据分析处理的整套流程。写得较为详(luo)细(suo)&#xff0c;希望适用于任何城乡规划大数据的初学者。持续更新中&#xff0c;若有错误&#xff0c;望指正&#xff01;1、任务总纲&#xff08;1&#xff09;职住数据导…

反序列化xml

我是.net 菜鸟。 今天学习一下反序列化xml&#xff0c;即将xml文件转换成程序更好识别的对象。 下面来看一个例子。这是一个xml文件。 <xml> <students> <student> <fields> <field value"name"><field> <field value"i…

【青少年编程】【三级】小鸡吃虫

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传

http://www.jb51.net/article/77223.htm https://www.cnblogs.com/breeze1988/p/4019510.html

display会影响canvas吗_多动症会影响智商吗?

小智&#xff08;化名&#xff09;小的时候非常皮&#xff0c;上学了也不老实&#xff0c;学习成绩还很差&#xff0c;一直是倒数&#xff0c;还有人说他智商低。父母带他到医院检查&#xff0c;一切都正常&#xff0c;智商也没问题。直到最近他被检查出多动症&#xff0c;小智…

SQL Server 数据库清除日志的方法

方法一&#xff1a; 1、打开查询分析器&#xff0c;输入命令 BACKUP LOG database_name WITH NO_LOG 2、再打开企业管理器--右键要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至xxm,这里会给出一个允许收缩到的最小m数,直接输入这个数,…

Axure8.0 网页 or App 鼠标滚动效果

1、index 页下添加一个内联框架&#xff0c;设置好自己想要的尺寸。 2、右键点击该内联框架转换为动态面板&#xff0c;并取消勾选“自动调整为内容尺寸”。 3、双击 “内联框架”选择并双击“state1” 切换到“内联框架的state1”页面&#xff0c;将“内联框架”组件的滚动条设…

【组队学习】【29期】1. 编程实践(数据可视化)

1. 编程实践&#xff08;数据可视化&#xff09; 航路开辟者&#xff1a;杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员&#xff1a;范佳慧航海士&#xff1a;杨剑砺、伊雪、肖桐、李晴晴、蔡婧旎 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/fantastic…

训练不出结果_智能训练仪:专业化智能防控近视训练设备

视觉训练精准化&#xff0c;近视防控效果佳智能训练仪小百科 智能训练仪是一款近视防控全功能智能康复设备&#xff0c;一机集成十大视功能康复模块&#xff0c;针对各种视功能异常引发的儿童及青少年假…

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解。它所做的每一个选择都是当前状态下局部最好选择。从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质&#xff1a;贪心选择性质和最优子结构性质。 1、贪心选择性质 贪心选择性质是 指所求问题的整体最…

百度认为什么样的网站更有抓取和收录价值

百度认为什么样的网站更有抓取和收录价值 百度认为什么样的网站更有抓取和收录价值呢?我们从下面几个方面简单介绍.鉴于技术保密以及网站运营的差异等其他原因&#xff0c;以下内容仅供站长参考&#xff0c;具体的收录策略包括但不仅限于所述内容。 第一方面&#xff1a;网站创…

【组队学习】【29期】2. 计算机视觉

2. 计算机视觉 航路开辟者&#xff1a;王程伟、任乔牧、张强、李芝翔领航员&#xff1a;杜蕊航海士&#xff1a;王程伟、任乔牧、张强、李芝翔 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-cv/tree/master/ImageProcessingFundamentals内…