
第1章 软件测试概述
1.1 软件测试的起源及发展
软件测试作为软件研发过程中旨在发现软件缺陷的一种活动,伴随着软件研发的出现而出现,只不过在早期的软件研发活动中,软件产品的总体规模都比较小,软件结构也都比较简单,软件研发过程相对比较随意,没有严格的研发过程管理手段和要求,所以软件测试的含义就比较狭窄,基本等同于软件调试,大部分情况下也是由软件研发人员自己完成的,目的是发现并纠正软件中存在的各种故障。
在早期的软件研发过程中,没有对软件测试的专门投入,也没有独立的软件测试人员,软件测试通常介入得也比较晚,常常是在软件编码完成之后进行简单的验证而已。直到1957年,软件测试才逐渐与软件调试区别开来,作为一种独立的活动以发现软件缺陷。但是,软件测试工作由于未受到足够的重视,通常被视为软件生命周期中的最后一项活动,加之当时软件测试技术不够先进,缺乏有效的测试方法,主要依靠错误推测法寻找软件中的缺陷,因此大量软件交付后,仍存在很多问题,软件产品的质量无法保证。
到了 20 世纪 70 年代,这个阶段开发的软件仍然不复杂,但人们已经开始思考软件开发流程的问题了,尽管当时对软件测试的重视程度依然不够,对其真正含义也缺乏共识,但软件测试这一词条已经频繁出现,一些软件测试的探索者建议在软件生命周期的开始阶段就根据软件需求制定测试计划,这时也涌现出一批软件测试的宗师,如Bill Hetzel博士就是其中的领导者。1972年,Bill Hetzel博士在美国的北卡罗来纳大学组织了历史上第一次正式的关于软件测试的会议。1973年,Bill Hetzel博士首先给出了软件测试的定义:建立一种信心,认为程序能够按预期的设想运行(Establish confidence that a program does what it is supposed to do)。1983年,他又将软件测试的定义修订为:评价一个程序和系统的特性或能力,并确定它是否能达到预期的结果,软件测试就是以此为目的的任何行为(Any activities aimed at evaluating an attribute or capability of a program or system)。在他的定义中,“设想”和“预期的结果”其实就是我们现在所说的用户需求或功能设计。另外,他还把软件的质量定义为“符合要求”。他的核心观点就是软件测试是试图验证软件是能够正常工作的。
后来,Glenford J.Myers针对软件测试的定义提出了新的观点,他认为软件测试不应该着眼于验证软件是能够正常工作的,相反,应该首先认定软件是有错误的,然后用逆向思维发现尽可能多的错误。他还从人的心理学的角度进行了论证,如果将“验证软件是能够正常工作的”作为测试目的,那么会非常不利于测试人员发现软件的错误。于是他于1979年提出了软件测试的定义:测试是为发现错误而执行的一个程序或系统的过程(The process of executing a program or system with the intent of finding errors)。这个定义得到了业界的广泛认可,经常被引用。Myers提出的“软件测试的目的是证伪”这一概念推翻了过去“为表明软件正确而进行测试”的错误认识,为软件测试的发展指明了方向,软件测试的理论、方法在之后得到了长足的发展。
到了20世纪80年代初期,软件和IT行业进入了发展时期,软件产品的规模不断增大,软件结构日趋复杂,软件产品的质量越来越重要。相应地,有关软件测试的基础理论和实用技术开始逐步形成,人们也开始为软件研发过程设计各种流程和管理方法,软件研发过程也逐渐由混乱无序向规范化方向发展,软件工程思想得以提出。软件测试作为软件工程全生命周期的独立活动,地位和作用逐渐得到提升。软件测试的定义也开始有了行业标准(IEEE/ANSI),1983年,IEEE提出的《IEEE软件工程标准术语》中给软件测试下了定义:使用人工或自动的手段来运行或测定某个软件系统的过程,目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。这个定义明确指出软件测试的目的是检验软件系统是否满足规定的需求。它再也不是一次性的、只是开发后期的活动,而是与整个开发流程融合成一体。软件测试已成为一个专业,需要运用专门的方法和手段,需要专门的人才和专家来承担。
之后,有关软件测试的理论、方法和模型得到快速发展,专门针对软件测试的相关国际标准开始逐步实施,包括ISO/IEC 9126:1991《软件产品评估 质量特性及其使用指南纲要》、ISO/IEC 12119:1994《信息技术 软件包 质量要求和测试》、ISO/IEC 14598:1999《软件工程 产品评价》等,都极大地推动了软件测试的发展。
在我国,软件测试相比于发达国家而言,受重视程度一直较低,直到 2000年“千年虫问题”的出现,我国开始逐渐重视软件测试工作。同时,随着我国信息化建设的不断发展,软件产业作为信息产业的核心,也被国家列入重点发展计划。为此,国务院先后颁布了《国务院关于印发鼓励软件产业和集成电路产业发展若干政策的通知》(国发〔2000〕18号)(简称18号文件)、《振兴软件产业行动纲要(2002年至2005年)》(简称47号文件)等文件,推动了软件产业政策环境的不断改善,软件产业进入快速发展期。
然而,由于软件质量跟不上软件产业发展的步伐,各种软件应用问题日益突出,软件测试作为提升软件质量的重要手段,逐渐得到相关管理部门的重视和推广。
为加强行业软件质量的管理,我国部分行业信息化管理部门陆续出台了一些行业性的软件检测管理规范。例如,卫生部早在2002年就成立了卫生部信息化工作领导小组,编制发布了《医院信息系统基本功能规范》,以此为基础,卫生部组织了多次商品化医院信息系统选型测试工作,推荐优秀的软件产品,供各级医院在进行信息化建设时参考。2002 年,教育部为促进教育系统应用管理软件的规范化管理,实现教育系统软件数据库结构、数据元格式的一致性,保证各级部门数据纵向、横向交换的顺利进行,负责组织编制并发布了《教育管理信息化标准》,并委托第三方专业软件机构按此标准对全国所有学校的教育信息管理软件进行标准符合性测试。2006 年,国家食品药品监督管理局组织编制了《互联网药品交易服务系统软件测评大纲》系列标准,规定只有通过认定的第三方软件机构的软件检测并取得相应的检测报告后,企业才可以通过互联网进行药品交易,旨在加强药品监督管理,规范互联网药品交易服务。2011 年,中国人民银行发布《非金融机构支付服务业务系统检测认证管理规定》,明确要求非金融机构在申请支付许可证时,必须进行业务系统技术标准符合性和安全性检测认证等。
与此同时,国际上对软件研发企业的过程质量管理也在逐步加强,在ISO9000、能力成熟度模型集成(CMMI)等系列质量管理体系认证中逐步细化了对软件研发过程和方法的要求,突出了软件研发企业产品质量测试要求,凸显了软件测试对保障软件质量的重要性。
2005年,在ISO/IEC 9126和ISO/IEC 14598的基础上,演变出了SQuaRE系列国际标准,包括ISO/IEC 2500n 质量管理分部(ISO/IEC 25000《SQuaRE指南》、ISO/IEC 25001《规划和管理》),ISO/IEC 2501n 质量模型分部(ISO/IEC 25010《系统和软件质量模型》、ISO/IEC 25012《数据质量模型》),ISO/IEC 2502n质量测量分部(ISO/IEC 25020《测量参考模型和指南》、ISO/IEC 25021《质量度量元素》、ISO/IEC 25022《使用质量测量》、ISO/IEC 25023《系统和软件产品质量测量》、ISO/IEC 25024《数据质量测量》),ISO/IEC 2503n 质量要求分部(ISO/IEC 25030《质量要求》),ISO/IEC 2504n质量评价分部(ISO/IEC 25040《评价过程》、ISO/IEC 25041《开发方、需方和独立评估方的评估指南》、ISO/IEC 25042《评估模块》、ISO/IEC 25045《易恢复性评估模块》)和ISO/IEC 25050~25099 扩展的标准和技术报告,并在后续根据技术的发展进行了持续更新。
2013年在BS 7925和IEEE 1008的基础上,演变出ISO/IEC/IEEE 29119系列标准,包括 ISO/IEC/IEEE 29119-1:2022《系统与软件工程 软件测试 第 1 部分:概念和定义》、ISO/IEC/IEEE 29119-2:2021《系统与软件工程 软件测试 第2部分:测试过程》、ISO/IEC/IEEE 29119-3:2021《系统与软件工程 软件测试 第3部分:测试文档》、ISO/IEC/IEEE 29119-4:2021《系统与软件工程 软件测试 第4部分:测试技术》,2016年又补充了ISO/IEC/IEEE 29119-5:2016《系统与软件工程 软件测试 第5部分:关键字驱动测试》,并在后续扩展了ISO/IEC TR 29119-6:2021《系统与软件工程 软件测试 第6部分:在敏捷项目中使用 ISO/IEC/IEEE 29119(所有部分)的指南》、ISO/IEC DTR 29119-8《系统与软件工程 软件测试第8部分:基于模型的测试》(发展中)、ISO/IEC TR 29119-11:2020《系统与软件工程 软件测试 第 11 部分:基于人工智能的系统测试指南》、ISO/IEC DTR 29119-13《系统与软件工程 软件测试 第13部分:ISO/IEC/IEEE 29119 在生物识别系统测试中的使用指南》(发展中)。
我国也根据国际标准的发展逐步制定了对应的国家标准,包括基于 ISO 25000系列的标准:
GB/T 25000.1—2021《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第1部分:SQuaRE指南》;
GB/T 25000.2—2018《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第2部分:计划与管理》;
GB/T 25000.10—2016《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第10部分:系统与软件质量模型》;
GB/T 25000.12—2017《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第12部分:数据质量模型》;
GB/T 25000.20—2021《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第 20 部分:质量测量框架》;
GB/T 25000.21—2019《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第21部分:质量测度元素》;
GB/T 25000.22—2019《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第22部分:使用质量测量》;
GB/T 25000.23—2019《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第23部分:系统与软件产品质量测量》;
GB/T 25000.24—2017《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第24部分:数据质量测量》;
GB/T 25000.30—2021《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第30部分:质量需求框架》;
GB/T 25000.40—2018《系统与软件工程 系统与软件质量要求和评价(SQuaRE)第40部分:评价过程》;
GB/T 25000.41—2018《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第41部分:开发方、需方和独立评价方评价指南》;
GB/T 25000.45—2018《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第45部分:易恢复性的评价模块》;
GB/T 25000.51—2016《系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第 51 部分:就绪可用软件产品(RUSP)的质量要求和测试细则》;
GB/T 25000.62—2014《软件工程 软件产品质量要求与评价(SQuaRE) 易用性测试报告行业通用格式(CIF)》。
还包括基于ISO/IEC/IEEE 29119的标准:
GB/T 38634.1—2020《系统与软件工程 软件测试 第1部分:概念和定义》;
GB/T 38634.2—2020《系统与软件工程 软件测试 第2部分:测试过程》;
GB/T 38634.3—2020《系统与软件工程 软件测试 第3部分:测试文档》;
GB/T 38634.4—2020《系统与软件工程 软件测试 第4部分:测试技术》。
可以说,目前,国内外各种政策和环境的变化对推动软件测试的发展起到了积极的促进作用,软件测试在国内外都受到了高度的重视,软件测试正面临着前所未有的发展机遇。