软件测试系列之四 单元测试(Junit)
在线课堂:https://edu.csdn.net/lecturer/1516
单元测试简介
单元测试就是测试程序员依据其所设想的方式开发出来的程序是否产生了预期的结果。单元测试是与软件开发生命周期中的编码阶段结合起来的,并且只有项目具备各个窗体、报表和屏幕之后才能开始进行测试。
编码阶段的基本单元式:程序、函数、过程、窗体、或者图形用户界面。在单元测试中,需要测试以下内容:代码的控制流程、给函数传递参数值、从函数获取值是否正确。另外,单元测试不只限于检查控制流程或者程序的执行,还检查代码是否遵循编码标准。
在对每个模块进行单元测试时,不能完全忽视它们和周围模块的相互关系。为模拟这一联系,在进行测试时,需设置若干辅助测试模块。辅助模块有两种,一种是驱动模块,用以模拟被测试模块的上级模块。驱动模块在单元测试中接收测试数据,把相关的数据传送给被测模块,启动被测模块,并打印出相应的结果。另一种是桩模块,用以模拟被测试模块工作过程中所调用的模块。桩模块由被测模块调用,它们一般只进行很少的数据处理,例如打印入口和返回,以便于检查被测试模块与其下级模块的接口。
测试中通常使用测试驱动模块和桩模块。测试驱动程序是帮助执行软件以检查其是否工作的软件。此程序提供一个框架来设置参数、执行单元并记录结果。桩模块不是实际单元而是模型,用以取代实际单元并帮助执行测试过程。
开发人员将测试作为编程的必要过程,并采用单元测试来验证它们的代码是否执行预期的功能。开放源码的单元测试框架有JUnit和Nunit。JUnit适用于Java应用程序,它是由SmallTalk的Sunit派生而来。Nunit用于测试.NET程序。PHPUnit是一个轻量级的PHP测试框架。JavaScript有JsUnit,数据库有DBUnit……
4.2 JUnit
4.2.1 JUnit简介
JUnit是由ErichGamma和KentBeck编写的一个回归测试框架。JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。JUnit是一套框架,继承TestCase类,就可以用JUnit进行自动测试了。
JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:
用于测试期望结果的断言(Assertion)。
用于共享共同测试数据的测试工具。
用于方便的组织和运行测试的测试套件。
图形和文本的测试运行器。
另外JUnit是在xp编程(Extreme Programming)和重构(refactor)中被极力推荐使用的工具,因为在实现自动单元测试的情况下可以大大的提高开发的效率,但是实际上编写测试代码也是需要耗费很多的时间和精力的,那么使用这JUnit好处到底在哪里呢?有以下几点供参考:
A、对于xp编程而言
要求在编写代码之前先写测试,这样可以强制你在写代码之前好好的思考代码(方法)的功能和逻辑,否则编写的代码很不稳定,那么你需要同时维护测试代码和实际代码,这个工作量就会大大增加。因此在xp编程中,基本过程是这样的:构思→编写测试代码→编写代码→测试,而且编写测试和编写代码都是增量式的,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。
B、对于重构而言
其好处和xp编程中是类似的,因为重构也是要求改一点测一点,减少回归错误造成的时间消耗。
C、对于非以上两种情况
我们在开发的时候使用JUnit写一些适当的测试也是有必要的,因为一般我们也是需要编写测试的代码的,可能原来不是使用的JUnit,如果使用JUnit,而且针对接口(方法)编写测试代码会减少以后的维护工作,例如以后对方法内部的修改(这个就是相当于重构的工作了)。另外就是因为JUnit有断言功能,如果测试结果不通过会告诉我们哪个测试不通过,是什么原因。而不是写一些测试代码看其输出结果,然后再由自己来判断结果使用正确,使用JUnit的好处就是这个结果是否正确的判断是它来完成的,我们只需要看看它告诉我们结果是否正确就可以了,在一般情况下会大大提高效率。
在测试代码时,必须遵守特定的命名惯例,待测的每种方法的命名应该testXXXX()的格式。任何编写的测试代码应执行并完成以下任务:
设置测试所需要的所有条件。
调用待测的方法。
验证待测的方法是否执行预期的功能。
清除。
测试代码的编写方式与程序代码相同。除了在测试代码中会用到附加库以外,其他的与程序代码相同。在执行的时候,执行测试代码而不是实际的项目代码。测试代码在一定程度上控制条件下检查项目代码。
JUnit提供一些测试方法,用于判断正在测试的特定方法是否正确执行那个功能。这些方法被称为asserts(),它断言某个特定条件是否为真。断言是单元测试中的基本结构。如表4-1所示,JUnit提供了多个assert()方法,这些方法包含在junit.framework.TestCase类中。
表4-1 JUnit中的断言
方法 |
功能描述 |
assertEquals |
判断给定两对象的值是否相等 |
assertNull |
断言给定对象是否为null |
assertNotNull |
断言给定对象是否不为null |
assertSame |
判断给定两对象是否指同一对象 |
assertNotSame |
判断给定两对象是否不是指同一对象 |
assertTrue |
断言给定的布尔条件是否为真 |
assertFalse |
断言给定的布尔条件是否为假 |
fail |
测试失败 |
断言失败时,将终止测试方法,并引发AssertionFailedError。
4.2.2 添加JUnit支持
无论是Eclipse还是MyEclipse都自带有JUnit,我们只需添加JUnit支持即可,想了解更多关于JUnit请参考官方网站 www.junit.org 。下面我们介绍如何在MyEclipse中添加JUnit支持。
1、在Package Explorer中选中要添加JUnit支持的项目,点击右键"Build Path",然后点Add Librarys
2.选择JUnit,然后点击Next按钮。
3.
选择JUnit版本(推荐JUnit 4),但后点击Finish,此时项目就引入了JUnit.jar,也可以采用直接复制junit.jar到lib下的方式。
4.2.3 第一个JUnit程序
现在有一个类JunitDemo.java文件,需要对addNum、subNum方法做测试。
-
package com.test.java;
-
/**
-
*
-
* @author 张晨光
-
* 待测试的java类,需要测试其中的两个方法,addNum,subNum
-
*/
-
public class JunitDemo {
-
public int addNum(int num1,int num2){
-
return num1+num2;
-
}
-
public int subNum(int num1,int num2){
-
return num1-num2;
-
}
-
}
实现步骤如下:
1.新建一个类JunitDemoTest.java。
2.导入junit.framework.TestCase包。
3.新建JunitDemo对象引用。
4.新建测试addNum、subNum的方法,命名为testAddNum、testSubNum
5.利用assertEquals进行断言。
代码如下:
-
package com.test;
-
import junit.framework.TestCase;
-
/**
-
*
-
* @author 张晨光
-
* 对JunitDemo类的addNum和subNum方法进行测试
-
*/
-
public class TestJunitDemo extends TestCase{
-
public void testAddNum(){
-
assertEquals(2,2,4);
-
}
-
public void testSubNum(){
-
assertEquals(3,2,1);
-
}
-
}
1.在项目右键以JUnit Test方式运行
2.运行结果如下图
Errors和Failures都是0,证明程序是没有问题的。
文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。
原文链接:aaaedu.blog.csdn.net/article/details/77601341
- 点赞
- 收藏
- 关注作者
评论(0)