JUnit单元测试
第一章:JUnit的框架原理分析
1. JUnit主要用于单元测试,所谓的单元测试就是常常说的白盒测试。它是一个开源的由JAVA开发的一个用于测试的框架。
2. 下面我们主要是来看一下JUnit的设计原理
2.1. 首先我们来看一下JUnit的框架图。
2.2. JUnit的几个基本的概念:TestCase,TestSuite,TestFixtrue
TestCase: 代表一个测试用例,每一个TestCase实例都对应一个测试,
这个测试通过这个TestCase实例的名字标志,以便在测试结果中指明哪
个测试出现了问题.TestCase继承自Assert,因此可以实现各种断言。
TestSuite:代表需要测试的一组测试用例,也就是测试用例的集合,
TestFixtrue:代表一个测试环境。它用于组合一组测试用例,这组测试
用例需要共同的测试运行环境。
2.3. junit的设计
2.3.1. Test接口: 代表一个测试。它是框架的主接口有两个方法:
int countTestCases();//返回所有测试用例的个数。
void run(TestResult result);//运行一个测试,并且收集运行结果
到TestResult.
2.3.2. TestCase类: TestCase实现了Test接口,是框架提供的供我们继承的类,我们的所有的测试方法都需要在TestCase的子类中定义,并且符合特定的设计协议。
一个TestCase实例代表一个具体的测试实例,对应一个对某一方法或概念的测试。每个TestCase实例都有一个名字。
一个TestCase类却定义了一个TestFixture。具体的说就是我们自己定义的TestCase子类中可以定义很多的public 没有参数的 testxxx方法。运行时,每个testxxx都在自己的fixture中运行。每个运行的TestCase都有一个名字,如果不指定,一般是TestCase中定义的test方法的名字。
2.3.3. TestSuite类: 和TestCase一样TestSuite也实现了Test接口。一个TestSuite可以包含一系列的TestCase。把testCase组装入TestSuite有几种方式:
A,通过将TestCase的Class参数传入TestSuite的构造函数,TestSuite会自动收集TestCase中所有的public的没有参数的testxxx方法加入TestSuite中。
B,构造空的TestSuite后通过void addTest(Test test)方法添加测试。
C:构造空的TestSuite后通过void addTestSuite(Class testClass) 方法添加测试集。
2.3.4. TestResult类: 主要通过runProtected方法运行测试并收集所有运行结果
2.3.5. TestRunner类: 启动测试的主类,我们可以通过直接调用它运行测试用例,IDE和其他一些工具一般也通过这个接口集成JUnit.
2.3.6. Assert类: 用于断言,TestCase继承自该类,我们的测试方法通过这些断言判断程序功能是否通过测试
2.3.7. TestListener接口: 测试运行监听器,通过事件机制处理测试中产生的事件,主要用于测试结果的收集。
以上是框架的核心接口和类的介绍,通过上面的介绍我们很容易看出来Test,
TestCase和TestSuite的设计采用了Composite模式。这样JUnit可以一次运行
一个测试用例,也可以一次运行多个测试用例,TestRunner只关心Test接口,而
对运行的是单个的TestCase还是同时运行多个TestCase并不在意
3. JUnit同时使用了Command模式,对于典型的Command模式一般有5
种角色 :
3.1命令角色(Command):声明执行操作的接口。有java接口或者抽象
类来实现
3.2. 具体命令角色(Concrete Command):将一个接收者对象绑定于一
个动作;调用接收者相应的操作,以实现命令角色声明的执行操作的接
口.
3.3. 客户角色(Client):创建一个具体命令对象(并可以设定它的接收者)。
3.4. 请求者角色(Invoker):调用命令对象执行这个请求.
3.5. 接收者角色(Receiver):知道如何实施与执行一个请求相关的操作。
任何类都可能作为一个接收者。
Test接口可以认为是命令模式中的命令角色Command接口,void run(TestRes
ult result)接口方法定义了需要执行的操作;TestCase可以看作是具体命令角色,
但又不全是,因为我们还需要自己通过继承TestCase类定义测试方法,这样的每一
个测试方法都回被包装在一个TestCase实例中。TestResult可以看作请求者角色
(Invoker),它会通过protected void run(final TestCase test) 运行测试并
收集结果。我们自己写的Test方法可以认为是接收者角色(Receiver),因为我们
的方法才具体执行这个命令。TestRunner就是客户角色(Client),它通过TestRe
sult result= createTestResult()构造TestResult,并通过suite.run(result)运
行测试用例(suite是一个Test接口的具体实例,可以是TestCase也可以是Test
Suite,但客户端不关心它是什么,这就是组合模式的好处。同时,suite.run(res
ult)又调用result.run(test),如果不仔细分析,就会被这种设计搞迷惑).
第二章:JUnit的好处和单元测试的编写原则
现在世面上有很多的测试工具,比如说NUNIT,PHPUNIT等。但是在JAVA的世界里面JUnit是最适合我们的单元测试工具。
A:可以使测试代码与产品代码分开
B:针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试
C:易于集成到测试人员的构建过程中,JUnit和Ant的结合可以实施增量开发
D:JUnit是公开源代码的,可以进行二次开发
E:可以方便地对JUnit进行扩展
编写原则:
A: 是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写
B: 是使测试单元保持持久性
C: 是可以利用既有的测试来编写相关的测试
第三章:JUnit的应用以及扩展
下面是关于JUNIT的扩展方面的,主要说的是junit.extensions包
1. ExceptionTestCase是TestCase的子类,用于对预见引发异常时的测试。生成该对象的时候要指明应该引发的异常的类型。runTest的时候会catch并吸收该异常。如果未发现该异常,则 测试失败
2. ActiveTestSuite是TestSuite的子类,用独立的线程来运行每个测试实例。runTest(Test, TestResult)开启新线程来运行Test。run(TestResult)对所有的Test运行runTest(Test, TestResult),并等待所有线程结束。
3. TestDecorator是Assert的子类,并实现了Test接口。它封装Test并把其Test.run(TestResult)作为一个basicRun(TestResult)。TestDecorator.run(TestResult)直接调用basicRun。子类可以重载run(TestResult),从而在原Test.run(TestResult)前后加入新的修饰代码
4. RepeatedTest是TestDecorator的子类。RepeatedTest.run(TestResult)重复指定次数运行TestDecorator.run(TestResult)。因此countTestCases()也要在TestDecorator.countTestCases()基础上乘以重复次数。
5. TestSetup是TestDecorator的子类。增加新的fixture。在basicRun(TestResult)前运行setUp(),在之后运行tearDown()。 BUG没有调用TestResult.startTest/endTest,即不产生开始/结束测试事件。
下面是个简单的例子:
Mytest.java类:
/*
* �������� 2006-7-31
*
* TODO Ҫ��Ĵ���ɵ��ļ���ģ�壬��ת��
* ���� �� ��ѡ�� �� Java �� ������ʽ �� ����ģ��
*/
/**
* @author mahb
*
* TODO Ҫ��Ĵ���ɵ�����ע�͵�ģ�壬��ת��
* ���� �� ��ѡ�� �� Java �� ������ʽ �� ����ģ��
*/
public class Mytest {
String name;
String birthday;
int age;
/**
* @return ���� age��
*/
public int getAge() {
return age;
}
/**
* @param age Ҫ���õ� age��
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return ���� birthday��
*/
public String getBirthday() {
return birthday;
}
/**
* @param birthday Ҫ���õ� birthday��
*/
public void setBirthday(String birthday) {
this.birthday = birthday;
}
/**
* @return ���� name��
*/
public String getName() {
return name;
}
/**
* @param name Ҫ���õ� name��
*/
public void setName(String name) {
this.name = name;
}
}
MytestTest .java类
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/*
* �������� 2006-7-31
*
* TODO Ҫ��Ĵ���ɵ��ļ���ģ�壬��ת��
* ���� �� ��ѡ�� �� Java �� ������ʽ �� ����ģ��
*/
/**
* @author mahb
*
�� ����ģ��
*/
public class MytestTest extends TestCase {
/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
}
/*
* @see TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Constructor for MytestTest.
* @param arg0
*/
public MytestTest(String arg0) {
super(arg0);
}
public static Test suite(){
TestSuite ts = new TestSuite();
//TestSuite ts = new TestSuite(MytestTest.class);
ts.addTest(new MytestTest("testgetName"));
return ts;
}
public void testgetName(){
Mytest mt = new Mytest();
mt.setName("mahb");
// assertEquals("gaofei",mt.getName());
System.out.println("12345455---" + mt.getName());
}
public void testgetBirthday(){
Mytest mt = new Mytest();
mt.setBirthday("1983.05.26");
// assertNull(mt.getBirthday());
assertNotNull(mt.getBirthday());
assertTrue(mt.getBirthday().equals("1982.1.20"));
System.out.println("-------"+mt.getBirthday());
}
}
分享到:
相关推荐
1、文件内容:abrt-devel-2.1.11-60.el7.centos.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/abrt-devel-2.1.11-60.el7.centos.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
房地产公司绩效管理办法(精品)
网卡驱动-r8169-linux-官方驱动,能翻墙的也可以去外网下,这里只是赚个积分,本人有时候也需要下载别人的资源,望理解,外网地址:https://www.realtek.com/Download/ToDownload?type=direct&downloadid=3378
基于非线性干扰观测器的自适应滑模反演控制策略在机械臂模型中的应用:神经网络MATLAB仿真研究,(文献+程序)基于非线性干扰观测器的自适应滑模反演控制 机械臂模型 神经网络 matlab仿真 滑膜 带原班文献 ,关键词:非线性干扰观测器; 自适应滑模反演控制; 机械臂模型; 神经网络; MATLAB仿真; 滑膜控制; 原班文献,基于非线性干扰观测器的机械臂自适应滑模反演控制:matlab神经网络仿真及原班文献解读
"电力电子方向入门学习:单相PWM整流无桥图腾柱pfc技术Simulink仿真实践,电压调控及优化性能探索",单相PWM整流无桥图腾柱pfc,simulink仿真 输入电压220v有效值 输出电压500v纹波在1%以内 功率因数为1 电流THD<5% 开关频率20k 可作为电力电子方向入门学习~~ ,关键词:单相PWM整流;无桥图腾柱PFC;Simulink仿真;输入电压220V;输出电压500V;纹波;功率因数1;电流THD<5%;开关频率20k;电力电子方向入门学习。,"单相PWM整流桥技术:无桥图腾柱PFC的Simulink仿真入门学习"
员工晋升申请表
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
FPGA实现CameraLink相机Base模式解码与HDMI高清视频输出方案,FPGA采集CameraLink相机Base模式 本文详细描述了FPGA采集CameraLink相机Base模式解码输出的实现设计方案,思路是这样的,CameraLink相机输入到FPGA板子,FPGA使用内部逻辑资源实现LVDS视频解码,解析出像素时钟、行同步信号、场同步信号、数据有效信号、以及像素数据,然后将视频转为Xilinx的AXI4-Sream的视频流,经VDMA送入DDR3缓存,然后读取出视频再经过AXI4-Sream to Video Out通过HDMI接口输出视频,这是Xilinx图像处理常用的套路,可谓相当精巧的方案 ,核心关键词:FPGA; CameraLink相机; Base模式; LVDS视频解码; 像素时钟; 同步信号; 像素数据; Xilinx AXI4-Sream; VDMA; DDR3缓存; HDMI接口视频输出。,"FPGA实现CameraLink相机Base模式视频解码与输出设计"
各岗位职责及操作
内容概要:本文介绍了稳定视频人脸修复(Stable Video Face Restoration, SVFR)方法,这是一个为解决一般化视频人脸修复(Generalized Video Face Restoration, GVFR)而设计的统一框架。作者针对现有技术未能有效处理时间一致性和运动伪影的问题提出SVFR方法,并通过实验展示其相较于单任务模型,在盲脸修复、颜色化和修补方面的性能显著提升。GVFR整合了三种子任务(BFR, colorization, 和 inpainting),并通过联合框架提高了训练效果,利用了预训练稳定视频扩散模型(SVD)。文中还引入了统一面部修复框架来确保跨子任务的一致特征表征,并提出了一种新的面部先验损失函数,通过面部特征点辅助修复过程并提高稳定性。 适用人群:适用于从事计算机视觉特别是视频识别和图像处理的研究者和技术工程师。 使用场景及目标:①用于高质量的人脸恢复,特别是在老旧电影或低质量监控录像等场合;②增强人脸识别准确性,确保长时间视频中身份一致性;③应用于需要真实感强的画面处理环境如在线会议直播。 其他说明:这项工作中提出的SVFR不仅解决了当前的技术难题,还为未来相关领域的研究和发展提供了重要参考价值,尤其体现在它所建立的新范例上,即如何通过多任务监督从有限数据集中获得更好的表现。
2025年义务教育新课程标准生物(2022年版)必考试题含答案.docx
直播带货销售业绩表
内容概要:本文详细记录了一个完整的基于Hadoop平台的WordCount任务实现过程,从环境准备到最终成果展示,涵盖了关键步骤的具体操作流程。首先介绍了创建所需文件夹结构并上传原始文本文件至HDFS;其次详述了构建Maven项目来组织相关源代码,以及定义Map(映射)、Combine(组合)、Reduce(归约)三个重要的处理环节所对应的程序逻辑;然后阐述了项目打包、分发过程及远程节点上部署运行该作业的整体思路;最后,通过访问Web界面确认最终生成的统计报告保存路径及其部分内容,验证任务成功完成。 适用人群:适用于初学者及有一定经验的数据工程师或研究人员,特别是那些希望快速掌握MapReduce模型实际应用技巧的人士。 使用场景及目标:此教程可以帮助用户深入了解Apache Hadoop生态系统内的MapReduce计算范式的运作机制。它演示了如何借助命令行工具高效管理和查询大规模非结构化或半结构化的数据集,从而支持后续更加复杂的分析任务的需求探索。此外,对于正在寻找入门级实战演练的学习者而言,这也是非常有价值的练习资料,既包括理论概念的学习也提供了充分的机会来进行动手实验。 其他说明:为了确保最佳实践效果,请注意跟随文中指引逐步尝试每一个新概念的应用,尤其是在编码部分,尽量不要跳过任何一步骤,并积极查阅官方文档或其他权威参考资料作为补充材料,遇到困难时也不必气馁,多做几次重复试验往往能带来意外收获。同时考虑到性能优化的可能性,可以在适当时候调整配置参数,比如增大堆栈容量或者更改块副本数目等。
2025义务教育历史新课程标准(2022版)必考题库含答案.docx
显示效果视频
员工晋升管理规定
2025年义务教育英语课程标准(2022版)必考题库及答案.docx
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
风储联合系统:直驱风机与储能技术的完美融合,创新能源存储解决方案,风储联合系统 直驱风机加储能系统 ,核心关键词:风储联合系统; 直驱风机; 储能系统; 联合系统。,"风储联动:直驱风机与储能系统的绿色能源集成"
双馈风力发电机模型研究:Simulink中的完美波形效果展示,涵盖DFIG模型对风速变化与电流电压特性的精准模拟。,双馈风力发电机模型研究(DFIG),simulink模型。 给定风速变化,电流与电压等波形效果完美。 ,核心关键词:双馈风力发电机模型研究(DFIG); Simulink模型; 风速变化; 电流波形; 电压波形; 效果完美。,"双馈风力发电机Simulink模型研究:风速变化下的电流电压波形优化"