一、软件测试的复杂性
1.完全测试是不现实的
在实际的软件测试工作中,不论采用什么方法,由于软件测试情况数量极其巨大,都不可能进行完全彻底的测试。所谓彻底测试,就是让被测程序在一切可能的输入情况下全部执行一遍。通常也称这种测试为“穷举测试”。
穷举测试会引起以下几种问题:
(1) 输入量太大;
(2) 输出结果太多;
(3) 软件执行路径太多;
(4) 说明书存在主观性。
E.W.Dijkstra的一句名言对测试的不彻底性作了很好的注解:“程序测试只能证明错误的存在,但不能证明错误的不存在”。由于穷举测试工作量太大,实践上行不通,这就注定了一切实际测试都是不彻底的,也就不能够保证被测试程序在理论上不存在遗留的错误。
2. 软件测试是有风险的
穷举测试的不可行性使得大多数软件在进行测试的时候只能采取非穷举测试,这又意味着一种冒险。比如在使用Microsoft Office工具中的Word时,可以作这样的一个测试:①新建一个Word文档;②在文档中输入汉字 “胡”;③设置其字体属性为“隶书”,字号为初号,效果为“ 空心”;④将页面的显示比例设为“500%”。这时在“胡”字的内部会出现“胡万进印”四个字。类似问题在实际测试中如果不使用穷举测试是很难发现的,而如果在软件投入市场时才发现则修复代价就会非常高。这就会产生一个矛盾:软件测试员不能做到完全的测试,不完全测试又不能证明软件的百分之百的可靠。那么如何在这两者的矛盾中找到一个相对的平衡点呢?
图4-1所示的最优测试量示意图可以观察到,当软件缺陷降低到某一数值后,随着测试量的不断上升软件缺陷并没有明显地下降。这是软件测试工作中需要注意的重要问题。如何把测试数据量巨大的软件测试减少到可以控制的范围,如何针对风险做出最明智的选择是软件测试人员必须能够把握的关键问题。
图4-1.png
图4-1说明了发现软件缺陷数量和测试量之间的关系,随着测试量的增加,测试成本将呈几何数级上升,而软件缺陷降低到某一数值之后将没有明显的变化,最优测量值就是这两条曲线的交点。
3.杀虫剂现象
1990年,Boris Beizer在其编著的《Software Testing Techniques》(第二版)中提到了“杀虫剂怪事”一词,同一种测试工具或方法用于测试同一类软件越多,则被测试软件对测试的免疫力就越强。这与农药杀虫是一样的,老用一种农药,则害虫就有了免疫力,农药就失去了作用。
由于软件开发人员在开发过程中可能碰见各种各样的主客观因素,再加上不可预见的突发性事件,所以再优秀的软件测试员采用一种测试方法或工具也不可能检测出所有的缺陷。为了克服被测试软件的免疫力,软件测试员必须不断编写新的测试程序,对程序的各个部分进行不断地测试,以避免被测试软件对单一的测试程序具有免疫力而使软件缺陷不被发现。这就对软件测试人员的素质提出了很高的要求。
4.缺陷的不确定性
在软件测试中还有一个让人不容易判断的现象是缺陷的不确定性。即并不是所有的软件缺陷都需要被修复。对于究竟什么才算是软件缺陷是一个很难把握的标准,在任何一本软件测试的书中都只能给出一个笼统的定义。实际测试中需要把这一定义根据具体的被测对象明确化。即使这样,具体的测试人员对软件系统的理解不同,还是会出现不同的标准。
二、软件测试的经济性
1.体现在测试工作在整个项目开发过程中的重要地位;
2.体现在应该按照什么样的原则进行测试,以实现测试成本与测试效果的统一。
软件工程的总目标是充分利用有限的人力和物力资源,高效率、高质量地完成测试。结合关于穷举测试具有不可行性,就可以理解为什么要在测试量与测试成本的曲线中选取最优测试点。
软件测试的充分性准则
1.对任何软件都存在有限的充分测试集合;
2.当一个测试的数据集合对于一个被测的软件系统的测试是充分的,那么再多增加一些测试数据仍然是充分的。这一特性称为软件测试的单调性;
3.即使对软件所有成分都进行了充分的测试,也并不意味着整个软件的测试已经充分了。这一特性称为软件测试的非复合性;
4.即使对一个软件系统整体的测试是充分的,也并不意味着软件系统中各个成分都已经充分地得到了测试。这个特性称为软件测试的非分解性;
5.软件测试的充分性与软件的需求、软件的实现都相关;
6.软件测试的数据量正比于软件的复杂度。这一特性称为软件测试的复杂性;
7.随着测试次数的增加,检查出软件缺陷的几率随之不断减少。软件测试具有回报递减性。
软件测试的流程
1.单元测试
2.集成测试
3.确认测试(功能测试)
4.系统测试
5.验收测试
测试流程图.png
在V模型中各个测试阶段的执行流程是:
单元测试是基于代码的测试,最初由开发人员执行,以验证其可执行程序代码的各个部分是否已达到了预期的功能要求;集成测试验证了两个或多个单元之间的集成是否正确,并且有针对性地对详细设计中所定义的各单元之间的接口进行检查;在单元测试和集成测试完成之后,通过确认测试验证软件的功能和性能及其他特性是否符合用户要求。接着系统测试开始用客户环境模拟系统的运行,以验证系统是否达到了在概要设计中所定义的功能和性能;最后,当技术部门完成了所有测试工作,由业务专家或用户进行验收测试,以确保产品能真正符合用户业务上的需要。
V模型.png
软件测试阶段的输入信息包括两类:
1.软件配置:指测试对象。通常包括需求说明书、设计说明书和被测试的源程序等;
2.测试配置:通常包括测试计划、测试步骤、测试用例以及具体实施测试的测试程序、测试工具等。
对测试结果与预期结果进行比较以后,即可判断是否存在错误,决定是否进入排错阶段,进行调试任务。对修改以后的程序要进行重新测试,因为修改可能会带来新的问题。
通常根据出错的情况得到出错率来预估被测软件的可靠性,这将对软件运行后的维护工作有重要价值。
软件测试的过程
1.测试计划
2.测试设计
3.测试执行
4.测试总结
1).软件测试计划
工作的输入是:软件测试任务书(或合同)和被测软件的需求规格说明。他们是开展软件测试计划的基础和依据。
测试的计划与控制是整个测试过程中最重要的阶段,它为实现可管理且高质量的测试过程提供基础。这个阶段需要完成的工作内容是:拟定测试计划,论证那些在开发过程难于管理和控制的因素,明确软件产品的最重要部分。
本阶段工作的输出是:软件测试计划。
2).测试设计
本阶段工作的输入是:软件测试计划。
软件测试设计阶段主要包含2个方面的工作:
一是测试用例的设计
二是测试用例的开发和实现。
本阶段要完成的主要任务如下:
在软件测试计划阶段中,通过测试需求分析得到细化后的每一个被测软件功能和特性,设计相应的软件测试用例。
针对每一个软件测试用例,确定其测试输入、测试步骤以及每一步骤的预期输出。
如果需要,开发和实现相应的测试输入。(自动化)
建立软件测试需求集和软件测试用例集之间的关联关系。(多对多)
本阶段工作的输出是:测试用例和测试数据。
3).测试执行
本阶段工作的输入是:测试用例和测试数据。
软件测试执行阶段,是在准备好的测试环境上依次执行各测试用例并详细记录每一步的测试结果。
本阶段主要完成的任务如下:
获得被测程序
获得指定的测试资源
执行测试用例
记录测试过程和测试输出数据。
本阶段工作的输出是:软件测试记录
4).测试总结
本阶段工作的输入是:软件测试计划、测试用例、软件测试记录。
软件测试总结阶段的主要工作是根据软件测试的执行情况,作出两方面的评价:
一是评价软件测试的效果;
二是评价被测试的软件。
本阶段主要完成的任务如下:
- 描述测试状态
- 描述软件状态
- 完成测试报告
- 保存测试文件
本阶段工作的输出是:测试报告。
网友评论