软件测试的生命周期
浅谈软件测试的生命周期
摘要 软件测试是软件质量保证的关键元素,软件系统的开发过程的每一个活动都有可能引入错误,而测试的目标就是为了发现错误而执行程序的过程。该文从软件测试的纵向过程和横向过程两个方向来解析软件测试的生命周期,并从整个软件开发过程来看软件测试的所有活动的位置。
关键词 软件测试 单元测试 集成测试 系统测试 计划 设计 开发 执行 评估
Abstract:Software testing is one of the key elements of Software Quality Assurance. In the software lifecycle, people will probably cause different errors for the software in every phrase. And software testing is an activity to detect errors as possible as it can. This paper analyses software testing lifecycle in two directions and states the exact position of testing activities in the software lifecycle.
Keywords:Software Testing,Unit Testing, Integrated Testing, System Testing, Plan, Design, Develop, Execute, Evaluate
1 引言
有些人认为,测试活动是在编码完成后才开始的,编码未完成,没有可执行程序,测试无法开始执行。无论是ISO9000质量管理体系[1],还是SEI的CMM软件能力成熟度模型[2]所阐述的测试活动,都表明了这种看法是一种对测试活动错误的狭义的认识。实际上,测试活动贯穿整个软件开发过程。
该文从软件测试的纵向过程和横向过程两个方向来说明测试的生命周期,并从整个软件开发过程来看软件测试的所有活动的位置及参与的角色。
2 软件测试的纵向过程
从过程的观点来考虑测试的整个过程的话,在软件工程环境中的测试事实上是顺序实 现的单元测试、集成测试、确认测试、系统测试四个纵向步骤的序列,这些步骤可用图2表示[3]。
图2:软件测试步骤
2.1 单元测试
最开始,测试着重于每一个单独的模块,以确保每个模块都能正确执行,也就是单元测 试。单元测试大量地使用白盒测试技术,检查每一个控制结构的分支以确保完全覆盖和最大可能的错误检查。软件的白盒测试依赖对程序细节的严密检验,提供针对特定条件与循环集的测试案例,它们可以:
(1) 保证一个模块中的所有独立路径至少被使用一次; (2) 对所有逻辑值均需测试真(true)和假(false); (3) 在上下边界及可操作范围内运行所有循环; (4) 检查内部数据结构以确保其有效性。
这样看来,只要我们定义所有的逻辑路径、开发相应的测试案例并评估结果,白盒测试就可以产生“百分百正确的程序”,但是,穷举所有的输入条件组合,即使是很小的程序,可能的逻辑路径数量也非常大,例如,考虑100行C语言程序,在一些基本的数据声明之后,程序包含两个嵌套循环,根据输入的条件分别执行1到20次,在内部循环中,需要四个if-then-else循环,共有5条路经,则执行路径就有520个,约为1014个可能的路径。假设1毫秒执行一个测试案例,都需要3170年的时间来测试这个程序。因此,对大型软件系统不可能进行穷举测试,但是我们可以选择有限数量的重要逻辑路径进行测试,检测重要数据结构的有效性。
2.2 集成测试
接着,模块必须装配或集成在一起形成完整的软件包,集成测试解决的是与验证和程序 构造这两个问题相关的问题,在集成过程中使用最多的是黑盒测试用例设计技术,为了保证一些大的分支的覆盖,也会用一定数量的白盒测试技术;
2.3 确认测试
在软件集成完成之后,一系列高阶测试就开始了,确认标准(在需求分析阶段就已经确 定下来了的)必须进行测试,确认测试提供了对软件符合所有功能的、行为的和性能的需求的最后保证,在确认过程中,只使用黑盒测试技术。很多情况下,确认测试不被作为一个单独的测试阶段被描述,可以作为集成测试的最后阶段,也就是当软件构建集成到最大集合的时候,对软件做的集成测试。
2.4 系统测试
软件一旦经过验证之后,就必须和其他的系统元素(比如硬件、人员、数据库)结合在 一起,系统测试要验证所有的元素能正确的结合在一起满足整个系统的功能/性能要求。
3 软件测试的横向过程
另外,每一个测试阶段,从横向来看也有一个完整的过程,跟软件开发过程的线性顺序 模型相似,一般包含以下活动[4]:
图3:软件测试过程
3.1 测试计划
测试从需求分析开始介入,测试人员参与需求的分析活动,确定测试的需求。测试 计划在需求分析完成后,程序修改完毕前准备。制定测试计划主要考虑测试需求及测试进度,即需要验证什么功能需求点,采用什么测试策略,描述目前在进行哪一阶段的测试(单元测试、集成测试、系统测试)以及每个阶段内在进行的测试种类(功能测试、性能测试、压力测试等)。
输入:项目计划和测试需求 输出:测试计划
3.2 测试分析与设计
测试设计在程序修改完毕前或程序修改完毕后进行。根据测试内容,分别准备合适的测试用例。 输入:测试计划 输出:新增测试用例及测试数据,原有回归测试数据集,真实数据。测试用例基本要素有:目的、前提条件、输入数据或动作、期望的结果。
3.3 测试开发
测试开发在程序修改完毕前或程序修改完毕后开始进行,一般与测试设计并行。测试开发主要工作为搭建测试环境,准备运行测试任务的脚本,准备检查测试结果的脚本。 输入:测试计划、测试用例
输出:测试环境、测试脚本、验证脚本
3.4 测试执行与评估
测试执行在程序修改完毕后,可执行代码提交后执行。具体步骤: 1、建立测试系统 2、准备测试过程 3、运行初始化过程 4、执行测试
5、从终止的测试恢复
6、验证预期结果,测试不通过,反馈回给编码人员修改。代码修改重新提
交后,返回2继续 7、调查突发结果 8、记录缺陷日记 9、回顾测试日记
10、评估测试需求的覆盖率 11、分析缺陷
12、决定是否达到完成测试的标准,没有满足标准时 1)、再测试 2)、降低标准
3)、确定软件的一个满足标准的子集,看是否可以结束本阶段测试。 输入:测试用例、测试环境、测试脚本、验证脚本 输出:《测试实况记录》、《测试报告》、《缺陷报告》
3.5 测试案例设计思想
从以上过程可以看出,测试的产出包括了一组针对内部逻辑和外部需求的测试案例[5]
被设计和文档化,期望的结果被定义,实际的结果被记录。一般来说,测试案例设计
思想本质上可以用下面这个图来体现:
各种类型输入
各种类型输出
关注点:
格式、输入频率…
图4:测试案例设计本质指导思想
即考虑系统的所有类型格式的输入项的内容、输入的频率及操作序列,明确系统处理的业务规则、转换逻辑及运行方式,定义系统相应的所有类型格式的输出项的内容及输出频率的期望结果,目标就是要验证和确认系统的实际结果与期望结果一致。
4 测试活动
最后,我们再从过程及项目参与角色两个维度来看一下软件开发过程中的测试过程[6]
的纵向和横向的所有测试活动所在的位置。
业务规则、 转换逻辑、
运行方式
…
格式、输出频率…
4.1 需求设计阶段
项目经理
需求分析人员
设计人员
测试组长
测试人员
图5:测试活动图1
4.2 编码测试阶段
代代代代
代代
代代代代
代代代代
图6:测试活动图2
由以上两个流程图可以看到,测试活动贯穿整个软件开发生命周期,从需求分析就开始介入。测试的定义已由从编码完成后才进行的动态测试这一狭义概念扩展到了包括系统架构评审、设计文档评审、代码走查等静态测试活动。
5 结束语
软件测试在软件过程中占有最大百分比的技术工作量,而我们只是刚刚开始理解系统化测试的计划、执行和控制的一些皮毛。软件测试的目的是发现错误,为了达到这个目的,需要计划和执行一系列的测试步骤——单元测试、集成测试、确认测试和系统测试。每一个测试步骤都是通过一系列有助于测试案例设计的系统化测试技术来完成的。
本文,我们详细的探讨了软件测试过程纵向及横向两个方向的测试活动流程。实践证明,测试越早介入,就能越有效的保证软件错误被及早发现而更有效的降低软件开发的成本。更高质量的软件需要更系统化的测试方法,关于测试的研究仍然是一门重要的、具有应用价值的学科。
参考文献 [1]ISO [2]CMM
[3] Roger S.Pressman著 梅宏译,《软件工程:实践者的研究方法》,北京:机械工业出版社,2002.9
[4]有效软件测试 [5]测试自动化 [6]软件测试过程