笔者按: 在这一学期的软件测试课程学习中,我逐渐接触到了软件测试的相关知识,实现了从较为关注软件编写与实现等前端内容到逐渐理解软件测试等项目后期环节的跨
越与 转变。而在软件测试领域,我们经常会听到测试框架这个名词,那什么是测试框架?它在软件测试中起到什么样的作用?我将就自己浅薄的学习心得,在这里为大
家做一个简单的分析与交流。
正文: 我们先来看一下百度百科给出的关于“框架”一词的定义:“框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题。” 那么如果我们将框架
这一概念引入到软件领域,可以给出什么样的一般性概念呢?笔者在对比了多种解释之后,认为以下的这种解释较为概括与全面:框架是整个或部分系统的可重用设计,
表现为一组抽象构件及构件实例间交互的方法。
针对以上的定义,我认为关键词在两个词上:“可重用”与“交互”。如果想要深刻理解这两个词的意义,我认为,在这里我们应该深究以下我们为什么需要在软件测试
领域中引入测试框架的概念,随着软件项目的逐渐增大,软件测试在软件开发中的地位显得越来越重要。如果软件项目没有良好的测试流程,随着系统的增大,无论项目
管理人员还是软件开发人员都会对项目的前景失去信心,甚至会对项目的目标产生分歧,因为长期以来没有对程序代码和系统设计进行有效的控制,很多问题都被暂时掩
盖或逐渐演化成其他的问题。软件开发周期越长,就会使得问题进化的版本越多,最后造成的结果是“剪不断,理还乱”。而测试框架的好处在于:提高开发速度,提升测
试代码的执行效率;提高软件代码质量,同时引入重构概念,让代码更干净和富有弹性;提升系统的可信赖度,作为回归测试的一种实现方法支持修复后“再测试”,确保
代码的正确性。常用的测试框架分类包括自动化测试框架和单元测试框架。根据所用开发平台不同,也可使用不同的测试框架展开测试。
关于“可重用”,我认为我们可以将软件测试框架简单地理解为:测试框架不是一个现成的完备的系统,而是一个半成品,测试工程师可以结合自己的测试对象的测试
需求,将其转化为对自己可用的测试用例。打一个简单的比方,测试框架就好比一个搭建好的舞台,而测试工程师(舞者)就这一在这个开放的、标准化的搭建好的舞台
上跳出自己想要跳出的舞蹈。软件测试框架提取了软件测试系统中的共性部分而形成的体系结构,在其基础上进行软件测试,只要调整部分内容就可以满足自己的需求,可
以有效地降低开发成本,缩短开发时间。这就是软件测试框架“可重用”属性的意义所在。
关于“交互”,我们知道,现在常用的测试框架有自动化测试框架和单元测试框架,自动化测试是为了代替目前较多的手动测试,而单元测试则是单元测试是整个测试
流程中最基础的部分,它们要求程序员尽可能早地发现问题,并给予控制,这是其一。另外,如果集成测试出现问题,它们可以帮助诊断。这样就为在软件开发流程中建
立高效的事件反应机制打下了坚实基础。 如果测试框架中无法实现构建的交互,单元测试就会变得艰难而难以开展,由此可见测试框架中“交互”一词的重要意义。
笔者结合自己学习到的知识,在这里给出单元测试框架的一个例子:JUnit,关于其他的种类的测试框架的具体实例,有兴趣的读者可以查阅相关论文,升入研究。
JUnit 是 Java 社区中知名度最高的单元测试工具;CppUnit 是个基于 LGPL 的开源项目,最初版本移植自 JUnit,是一个非常优秀的开源测试框架。
使用JUnit时,主要都是通过继承TestCase类别来撰写测试用例,使用testXXX()名称来撰写单元测试。
用JUnit写测试真正所需要的就三件事:
1.一个import语句引入所有junit.framework.*下的类。
2.一个extends语句让你的类从TestCase继承。
3.一个调用super(string)的构造函数。
功能类MathTool:
packagecom.zj.c01;
publicclassMathTool {
publicstaticintgcd(intnum1,intnum2) {
intr = 0;
while(num2 != 0) {
r = num1 % num2;
num1 = num2;
num2 = r;
}
returnnum1;
}
}
测试类MathToolTest:
packagecom.zj.c01;
importjunit.framework.TestCase;
publicclassMathToolTestextendsTestCase {
publicMathToolTest(String name) {
super(name);
}
publicvoidtestGcd() {
assertEquals(5, MathTool.gcd(10, 5));
}
}
补充: JUnit的各种断言
JUnit提供了一些辅助函数,用于帮助你确定某个被测试函数是否工作正常。通常而言,我们把所有这些函数统称为断言。断言是单元测试最基本的组成部分。
1. assertEquals([String message], expected,actual)
比较两个基本类型或对象是否相等(expected和actual是原始类型数值(primitive value)或者必须为实现比较而具有equal方法);
2.assertFalse([String message],boolean condition)
对布尔值求值,看它是否为“真“;
3.assertTrue([String message],boolean condition)
对布尔值求值,看它是否为“假“;
4.assertNull([String message],java.lang.Object object)
检查对象是否为“空“;
5.assertNotNull([String message],java.lang.Object object)
检查对象是否不为“空”;
6.assertSame([String message],expected,actual)
检查两个对象是否为同一实例;
7.assertNotSame([String message],expected,actual)
检查两个对象是否不为同一实例;
8. fail( String message )
使测试立即失败,其中 message 参数使可选的。这种断言通常被用于标记某个不应该到达的分支(例如,在一个预期发生的异常之后)
相关知识:
白盒与黑盒框架
框架可分为白盒(White-Box)与黑盒(Black-Box)两种框架。相关概念的详细内容,有兴趣的读者可以自行深入了解、学习。