1、几个相关的概念
白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。
回归测试——软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用。
单元测试——是最小粒度的测试,以测试某个功能或代码块。一般由程序员来做,因为它需要知道内部程序设计和编码的细节。
JUnit ——是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2、单元测试概述
2.1、单元测试的好处
A、提高开发速度——测试是以自动化方式执行的,提升了测试代码的执行效率。
B、提高软件代码质量——它使用小版本发布至集成,便于实现人员除错。同时引入重构概念,让代码更干净和富有弹性。
C、提升系统的可信赖度——它是回归测试的一种。支持修复或更正后的“再测试”,可确保代码的正确性。
2.2、单元测试的针对对象
A、面向过程的软件开发针对过程。
B、面向对象的软件开发针对对象。
C、可以做类测试,功能测试,接口测试(最常用于测试类中的方法)。
2.3、单元测试工具和框架
目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PhpUnit(Php )等等。该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。
3.Junit入门简介
3.1、JUnit的好处和JUnit单元测试编写原则
好处:
A、可以使测试代码与产品代码分开。
B、针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试。
C、易于集成到测试人员的构建过程中,JUnit和Ant的结合可以实施增量开发。
D、JUnit是公开源代码的,可以进行二次开发。
C、可以方便地对JUnit进行扩展。
编写原则:
A、是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写。
B、是使测试单元保持持久性。
C、是可以利用既有的测试来编写相关的测试。
3.2、JUnit的特征
A、使用断言方法判断期望值和实际值差异,返回Boolean值。
B、测试驱动设备使用共同的初始化变量或者实例。
C、测试包结构便于组织和集成运行。
D、支持图型交互模式和文本交互模式。
3.3、JUnit框架组成
A、对测试目标进行测试的方法与过程集合,可称为测试用例(TestCase)。
B、测试用例的集合,可容纳多个测试用例(TestCase),将其称作测试包(TestSuite)。
C、测试结果的描述与记录。(TestResult) 。
D、测试过程中的事件监听者(TestListener)。
E、每一个测试方法所发生的与预期不一致状况的描述,称其测试失败元素(TestFailure)
F、JUnit Framework中的出错异常(AssertionFailedError)。
JUnit 框架是一个典型的 Composite 模式: TestSuite 可以容纳任何派生自 Test 的对象;当调用 TestSuite 对象的 run() 方法是,会遍历自己容纳的对象,逐个调用它们的 run() 方法。(可参考《程序员》 2003-6 期)。
3.4、JUnit的安装和配置
JUnit安装步骤分解:
3.5、JUnit中常用的接口和类
Test接口——运行测试和收集测试结果
TestCase抽象类——定义测试中固定方法
Assert静态类——一系列断言方法的集合
TestSuite测试包类——多个测试的组合
A 测试用例必须是公有类(Public)
B 测试用例必须继承与TestCase类
C 测试用例的测试方法必须是公有的( Public )
D 测试用例的测试方法必须被声明为Void
E 测试用例中测试方法的前置名词必须是test
F 测试用例中测试方法误任何传递参数
n TestResult结果类和其它类与接口
3.6、JUnit一个实例
在控制台中简单的范例如下:
1、写个待测试的Triangle类,创建一个TestCase的子类ExampleTest:
2、 ExampleTest中写一个或多个测试方法,断言期望的结果(注意:以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试)
3、 ExampleTest中写一个suite()方法,它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件:
4、 ExampleTest可以写setUp()、tearDown()方法,以便于在测试时初始化或销毁测试所需的所有变量和实例。(不是必须的)
5、写一个main()方法以文本运行器或其它GUI的方式方便的运行测试
6、编译ExampleTest,执行测试。
3.7、Eclipse中JUnit的使用
Eclipse自带了一个JUnit的插件,不用安装就可以在你的项目中开始测试相关的类,并且可以调试你的测试用例和被测试类。
使用步骤如下:
1、新建一个测试用例,点击“File->New->Other…菜单项,在弹出的“New”对话框中选择”Java->JUnit”,下的TestCase 或TestSuite,就进入“New JUnit TestCase”对话框
2、在“New JUnit TestCase”对话框填写相应的栏目,主要有Name(测试用例名),SuperClass(测试的超类一般是默认的junit.framework.TestCase),Class Under Test(被测试的类),Source Folder(测试用例保存的目录),Package(测试用例包名),及是否自动生成main,setUp,tearDown方法。
3、如果点击下面的”Next>”按钮,你还可以直接勾选你想测试的被测试类的方法,Eclipse将自动生成与被选方法相应的测试方法,点击“Fishish”按钮后一个测试用例就创建好了。
4、编写完成你的测试用例后,点击“Run”按钮就可以看到运行结果了。
3.8、JUnit的扩展应用
以下罗列了些JUnit的扩展应用:
JUnit + HttpUnit=WEB功能测试工具
JUnit + hansel =代码覆盖测试工具
JUnit + abbot =界面自动回放测试工具
JUnit + dbunit =数据库测试工具
JUnit + junitperf=性能测试工具
3.9、一些使用JUnit经验
参考资料与附件
1. http:// www.junit.org JUnit官方网站
2. http://bbs.51cmm.com 的测试论坛
3. http://www.uml.org.cn 的软件测试专栏
4. 单元测试 《程序员》 2002年7期
5. JUnit设计模式分析 《程序员》2003年6期
6. 《软件测试和JUnit实践》
7. 附件Triangle.java 一个要测试的类
8. 附件ExampleTest.java 一个测试用例类
Triangle.java
/**
* this is Triangle class
* @author liujun
*/
public class Triangle
{
//定义三角形的三边
protected long lborderA = 0;
protected long lborderB = 0;
protected long lborderC = 0;
//构造函数
public Triangle(long lborderA,long lborderB,long lborderC)
{
this.lborderA = lborderA;
this.lborderB = lborderB;
this.lborderC = lborderC;
}
/**
* 判断是否是三角形
* 是返回ture;不是返回false
*/
public boolean isTriangle(Triangle triangle)
{
boolean isTrue = false;
//判断边界,大于0小于200,出界返回false
if((triangle.lborderA>0&&triangle.lborderA<200)
&&(triangle.lborderB>0&&triangle.lborderB<200)
&&(triangle.lborderC>0&&triangle.lborderC<200))
{
//判断两边之和大于第三边
if((triangle.lborderA<(triangle.lborderB+triangle.lborderC))
&&(triangle.lborderB<(triangle.lborderA+triangle.lborderC))
&&(triangle.lborderC<(triangle.lborderA+triangle.lborderB)))
isTrue = true;
}
return isTrue;
}
/**
* 判断三角形类型
* 等腰三角形返回字符串“等腰三角形”;
* 等边三角形返回字符串“等边三角形”;
* 其它三角形返回字符串“不等边三角形”;
*/
public String isType(Triangle triangle)
{
String strType = "";
// 判断是否是三角形
if(this.isTriangle(triangle))
{
//判断是否是等边三角形 if(triangle.lborderA==triangle.lborderB&&triangle.lborderB==triangle.lborderC)
strType = "等边三角形";
//判断是否是不等边三角形
else if((triangle.lborderA!=triangle.lborderB)&&
(triangle.lborderB!=triangle.lborderC)&&
(triangle.lborderA!=triangle.lborderC))
strType = "不等边三角形";
else
strType="等腰三角形";
}
return strType;
}
}
ExampleTest.java
import junit.framework.*;
/**
* Some tests.
*
*/
public class ExampleTest extends TestCase {
public Triangle triangle;
//初始化
protected void setUp() {
triangle=new Triangle(10,2,9);
}
public static Test suite() {
return new TestSuite(ExampleTest.class);
}
//函数isTriangle()的测试用例
public void testIsTriangle() {
assertTrue(triangle.isTriangle(triangle));
}
//函数isType()的测试用例
public void testIsType()
{
assertEquals("这次测试",triangle.isType(triangle),"不等边三角形");
}
//执行测试
public static void main (String[] args) {
//文本方式
junit.textui.TestRunner.run(suite());
//Swingui方式
//junit.swingui.TestRunner.run(suite().getClass());
//awtui方式
//junit.awtui.TestRunner.run(suite().getClass());
}
}