1.3 软件测试发展历程
软件测试发轫于不断增加的软件缺陷及不可控的软件质量,是质量工程的重要子域。软件测试伴随软件产生而产生,伴随软件发展而发展。对应于软件开发及质量工程发展历程,软件测试经历了发轫、发展及成熟三个发展阶段。
发轫阶段:需求驱动,测试概念产生。肇始之初,软件规模小、结构简单,与硬件紧密耦合,通常被当作硬件的附属物,开发过程无序,遑论软件测试乎!在这个阶段,调试是主要的质量保证手段。调试是软件开发及质量保证不可或缺的工作,主要用于解决编译及单个方面的问题,尚不能验证程序逻辑、内外接口、不同功能模块之间的耦合等问题。直到20世纪50年代后期,作为程序错误检测的重要手段之一,软件测试逐渐与调试分离,成为一项确定的过程活动。这一时期,主要依靠错误推测(经验或直觉),推测程序中可能存在的错误。但因测试技术落后,测试流程不规范,错误检出能力有限,即便是经过测试的软件也常常受到错误的困扰。20世纪60年代,软件错误导致开发成本、进度和质量失控,软件危机爆发。如何避免错误产生并消除错误,实现质量目标,业界在程序设计语言、软件开发模型、形式化设计、程序正确性证明等方面进行了卓有成效的探索,软件工程兴起。但是,这并未从根本上解决软件质量问题,期望另辟蹊径的人们不得不再次将注意力转移到软件测试上来。但这个时期的软件测试主要是靠猜想和推断,尚未形成明确的定义、定位及方法论。1973年,Bill Hetzel首次将软件测试定义为:对程序或系统能否完成特定任务建立信心的过程。该定义的提出标志着软件测试的诞生。不过该定义很快受到质疑,思想一旦爆发,就会引发百家争鸣。Glenford J.Myers认为,软件测试应认定软件存在错误,基于逆向思维,发现错误。鉴于此,1979年,Myers在The art of software testing中将软件测试定义为:为发现错误而执行程序或系统的过程。该定义将软件测试视为编码实现结束之后一项确定的过程活动,面向程序,解构软件,侧重于软件逻辑结构分析及代码错误查找,旨在检出未发现的错误,以证明程序存在错误,而非证明程序不存在错误,这是一个证伪过程。这一思想为软件测试技术发展奠定了基础。但此概念深受瀑布模型影响,混淆了软件测试的目的和手段,忽视了影响软件行为及质量的文档、数据和环境等要素,忽视了软件开发过程活动,以及应用系统的整体行为和用户需求,滋生了软件测试的随意性、盲目性和片面性。
发展阶段:面向软件,保证产品质量。20世纪80年代,软件开发演进到结构化设计,开发流程和管理模式逐渐规范,C语言诞生,面向对象技术兴起,软件结构日趋复杂,规模不断增加,应用领域不断拓展。软件测试旨在检出错误,对软件需求进行确认,对软件质量进行度量和评价,成为软件开发过程中重要的质量保证活动。1983年,Bill Hetze1在Complete Guide of Software Testing中将软件测试定义修改为:评价一个程序和系统的特性或能力,确定其是否达到预期结果。该定义是基于软件需求,针对软件功能点,采用特定方法,在规定的环境中验证并评价软件系统的符合性,不再局限于代码分析,强力地推进了软件测试基础理论、基础技术、应用技术研究及工程实践进展。同年,IEEE ANSI将软件测试定义为:使用人工或自动手段运行或测定软件系统,判定预期结果和实际结果的差别,确认其是否满足规定的需求。该定义将软件测试视为软件开发过程中为发现错误、验证软件需求的符合性而执行程序的一项过程活动,将测试对象从程序拓展到文档和数据,将软件测试活动从静态的程序分析拓展到动态的错误检测,软件测试不再停留在编码实现之后这一特定阶段,而是贯穿于整个开发过程。尽管该定义依然停留在确定的层面上,却将软件测试从狭义的查错拓展到广义的质量工程。直到今天,这一成果在软件测试领域依然产生着深远的影响。
成熟阶段:面向用户,确保使用质量。20世纪90年代,基于互联网平台、分布式对象模型以及面向对象、面向服务等软件开发技术,软件系统架构发生重大变化,软件质量问题逐渐演化为系统质量问题。软件测试不仅局限于需求验证,而是对用户要求及交付能力的验证和确认,其重要性被推向了前所未有的高度,成为软件质量保证的一根“稻草”,测试基础理论、基础技术、应用技术研究持续深化,代码扫描、静态分析、性能测试、捕获回放、Web测试技术等快速发展。2000年之后,随着高可信软件、网构软件、敏捷开发、持续集成、DevSecOps及智能软件技术等发展的内生需求,移动应用测试、云服务平台测试、大数据及应用测试、微服务测试、敏捷测试、软件开发工具包(Software Development Kit,SDK)测试、API自动化测试、WebService测试、DevSecOps测试等技术研究及应用实践得以快速发展,基于容器的持续集成测试平台建设,构建于Kubernetes上的微服务持续集成测试、大数据并发场景下的性能测试、基于云计算环境的规模化测试、基于行为驱动开发(Behavior-Driven Development,BDD)端到端的自动化测试、iOS UI自动化+基于Docker的分布式测试等技术得以广泛应用示范,取得显著成效。公共测试技术平台及各类专业测试机构如雨后春笋般涌现,测试技术体系、标准体系与工程管理体系以及基于测试驱动的软件质量工程快速发展,软件测试迈入规范化、专业化、服务化、产业化发展之路。
伴随着软件开发技术的发展,人们对于软件质量的认知以及测试验证能力、质量保证能力持续演化发展,软件测试需求、测试目的、测试技术等亦随之演化发展。基于被测对象及不同测试模式的技术特征、组织形态等,可以基于不同视角描述软件测试的发展演进过程。图1-4给出了一个基于被测应用系统形态,前向兼容、序化演进的软件测试演化过程。
图1-4 基于被测对象及不同测试模式的软件测试演化过程
自软件测试概念诞生以来,业界从测试目的、测试对象、测试技术、测试流程、测试能力等不同维度,对软件测试进行定义,有人甚至将软件测试视为一种艺术,从哲学的角度进行定义,从《易经》中寻找答案,但均未形成主流,亦未根本改变软件测试的定义及内涵。但基于系统工程思想,一种内生、外促的软件测试思维模式,正在演化成为促进软件测试最佳实践的方法论,已是不争的事实。
基于内部质量视角,软件测试是为发现错误而执行程序的过程,即依据软件开发阶段的规格说明、开发文档、程序结构等,基于逆向思维模式,解构软件,设计测试用例,运行被测应用,暴露隐藏的错误和缺陷。基于外部质量视角,软件测试是贯穿于软件生命周期过程的验证和确认活动,验证软件系统是否完整、正确地实现了系统规格所定义的系统功能及其特性。基于规约、设计、编码检查与验证,软件测试是软件质量保证、软件工程的重要内容。基于使用质量视角,软件测试则跳出了错误检测、验证确认等的掣肘,面向用户,基于系统行为建模,聚焦于交付能力、用户体验、用户价值及社会价值提升。这是软件测试概念演化的新方向,是软件测试发展的新阶段和新模式。
一致性难以保证应用系统满足用户需求以及需求的持续演化。业界以用户为关注的焦点,关切用户感受,充分理解用户行为需求,将软件测试作为跨学科、跨领域活动,通过不断调查和讲故事的方式完成体验式测试、探索式测试、社会调查式测试,挖掘软件系统的使用价值和社会价值,拓展价值展现维度,放大价值创造空间,服务社会经济发展。
回溯软件测试发展历程,展望软件测试美好未来,基于价值驱动和系统工程思维,从软件测试的基本概念出发,澄清软件测试的目的,揭示软件测试的内涵,推进基于软件测试驱动的缺陷工程、性能工程、质量工程、价值工程发展,是软件测试的美好愿景。