软件测试:实践者方法
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

这是一个软件定义的百年未有之大变局时代!

基于软件定义,以信息平台为基础载体,以数据资源为关键要素,融合应用以全要素数字化转型为驱动力的新技术、新产品、新模式、新业态,代际跃升,群体演进,推进以绿色、智能及泛在为特征的关键引领技术跨越发展,构成纷繁的物理—数字时空,自然世界与虚拟世界深度融合,原子世界向比特世界高歌猛进。软件已成为国民经济和社会发展的基础性、战略性、先导性产业。碳基只是载体,软件才是核心。

一个日益增长的需求是:软件应具有检定合格的质量和持续交付能力。然而,快速增加的系统复杂性、不确定性、演化性及需求过载、集成变更、版本迭代、海量增长的数据,无处不在的Bug(程序错误),导致软件质量形成及改进面临前所未有的挑战,即便是日常生活中的一般应用亦概莫能外。无人驾驶、轨道交通、宇航探索、核安控制、金融服务等可靠性、安全性攸关的系统,对软件质量提出了新的更高要求。与此同时,随着大规模敏捷、DevSecOps、持续集成交付等开发模式的迭代演进,大数据集成及增强现实、混合数据架构、开放弹性业务架构及应用容器化、微服务及无服务架构等的广泛应用,语言模型构成了一个全新的软件栈基础,日益复杂及不断重构的过程中异构软件功能难以形成合力,进一步加剧了质量风险。我们惶恐地生活在质量的大堤之下。未来已来,与有荣焉?

软件质量构建于富有弹性的设计、规范有序的管理、充分完备的测试、持续改进且不断增强的过程能力之上,是区分产品与服务的核心要素。在快速迭代演进的研发模式下,如何实现软件质量控制及改进的重大提升,是软件测试人员或团队必须面对并着力研究解决的问题。业界将关注的重点集中于两端:一端基于系统构建,进行全程测试,检出缺陷,规避过程及产品质量风险;另一端基于用户体验,在关键路径抽取关键绩效指标(Key Performance Indicator,KPI),进行全栈分析,测试验证质量目标的实现情况。而不幸的是,有望从根本上改进软件质量的代码生成、服务重用、应用程序编程接口(Application Programming Interface,API)推荐、形式化设计等先进软件开发及自主测试、程序正确性证明、形式化验证、超级自动化测试等重大关键技术,尚待进一步突破和实践检验。敢问路在何方?

软件测试是在确定的环境中,运行并测定软件,检出错误,度量并评价软件的符合性、正确性、适用性、完全性、稳定性及交付能力是否满足使用要求的过程活动,是软件错误的过滤器,是软件质量的把关者,是用户权益的捍卫者,是流程治理的实践者,是过程改进的创新者,是软件文明的守望者。通过业界卓绝的探索和广泛实践,逻辑、数据、流程驱动的软件测试技术已臻成熟,剖面、能力驱动的软件测试技术亦取得长足进展,为软件测试技术发展奠定了坚实的基础。持续测试、超级自动化测试、人工智能测试、基于测试驱动的质量工程,是软件测试技术发展的重要方向。随着人工智能技术的快速发展,基于人工智能生成内容的高效学习效率、生成式大模型的多模态处理能力,给测试用例生成、文本输入生成、自动化执行与回归、智能缺陷检测、缺陷自动修复、智能协作等技术发展注入了新的动能,推动软件测试技术实现新发展。但即便如此,存在的问题比已有答案多得多。

软件测试是基于软件行为建模的数据抽样验证,是基于测试过程模型、能力模型、价值模型,序化演进的系统工程过程。整合离散的测试资源,建设集基础设施、测试环境、测试用例、场景数据、环境数据、缺陷数据等资产于一体,测试验证、分析评价、认可认证相互融合,云化承载的测试基础能力体系,建设创新驱动、嵌套闭环、开放融合、持续改进的质量提升生态,面向过程,聚焦测试策划,着眼测试设计,着力测试执行,以质量、效率、能力驱动可视、可测、可信的测试过程改进及能力提升,实现逻辑覆盖、业务覆盖、能力覆盖与质量目标综合,错误检测、故障预测及健康管理融合,软件测试与系统验证、能力评价、质量保证及组织战略交联,以测保质、以测促研、以测促产、以测促用,推进基于测试驱动的客户价值提升。这是软件测试的初心和使命。

软件测试人,是对软件问题最敏感、对软件质量最敬畏的群体之一。七十多年来,通过几代软件测试人的执着探索,勇毅实践,软件测试从迷茫到觉悟,从概念到体系,从抽象到具体,从具象归于抽象。这是软件工程发展的必然结果,是质量工程发展的必然选择,而这些都离不开技术的创新、方法的运用、知识的积淀、能力的支撑及实践的驱动,更加离不开软件测试人艰辛的努力和智慧的付出。如果来时的方向只靠不断回望,必将裹足不前,需不断审视、探索与践行,超越绝对的积极与消极、纯粹的乐观与悲观,在极端的不对称中发现契机,寻找逆袭点,再出发。

浸淫于软件测试近二十载,除了诚心敬畏每一行代码,认真对待每一个问题,在这条不只局限于技术概念的道路上,常有所思,偶有所得,却未能分杯于斯。自发的演练,并非偶然。在内心的反复挣扎之后,鼓起勇气,站在前人的肩膀上,把对软件测试的思和想,情感与共鸣集结到一起,期望能够在软件测试及质量工程界,营造一种能够引起广泛兴趣的学术氛围,为软件测试专业化、服务化、融合化、产业化发展构造一个创新驱动、技术引领、开放融合的技术生态与工程实践示范。

全书分为11章。第1章分析软件质量、软件测试技术的现状及存在的问题,跟踪软件测试的发展历程,研究软件测试的发展趋势,为本书结构构建及内容展开建立基础。第2章基于软件质量模型,简述软件测试及其相关概念,构建软件可测试性生命周期过程模型,讨论不同级别的可测试性问题;定义软件缺陷,分析软件失效机理,为基于软件失效行为及故障假设的软件测试奠定基础。第3章基于软件测试过程模型及成熟度模型,构建软件测试价值模型,给出软件测试模型开发及选择策略。第4章基于软件测试价值模型,提出基于目标、基于风险、基于能力驱动的测试策略及测试策划的实践者方法,介绍软件测试的不确定性及控制方法。第5章基于图结构及图元素,介绍逻辑覆盖、路径覆盖、循环结构覆盖、符号执行等经典逻辑驱动测试技术,讨论逻辑驱动测试的边界值问题,介绍同源检测、基于语义检测与规则集聚类的静态分析融合方法。第6章基于软件可用性理论,介绍等价类划分、边界值分析、场景驱动、决策表驱动、因果图分析、功能图分析、正交试验设计、均匀试验设计、组合测试、被动测试等数据驱动测试的概念、理论基础、技术原理及工程实践方法。第7章面向服务软件,构建面向服务的测试框架,基于服务模型的形式化描述及求解,讨论服务实体、有状态服务实体及基于时间波动的服务实时性测试技术及实践者方法。第8章基于软件运行周期的可靠性风险,构建软件运行剖面,介绍随机过程类、非随机过程类、构件软件可靠性模型,讨论软件可靠性增长测试、可靠性验证测试的概念、技术原理、充分性准则及基于蒙特卡罗方法的软件可靠性测试。第9章基于大数据架构模型及大数据应用安全要素,构建大数据及应用测试体系,讨论大数据及算法、大数据应用性能、大数据应用安全性测试技术与方法。第10章基于系统行为模型,构建基于环境应力剖面、软件状态剖面、多域任务场景综合的一体化测试剖面,介绍数据归纳及统计容差修正、基于动态故障树的失效不确定性建模,以及基于退化模型及多域任务场景驱动的一体化测试技术及方法。第11章构建基于质量、效率驱动的软件测试框架及开放融合的测试类型集,以丰富的案例,分享文档类、代码类、数据类、功能类、性能类、接口类和专项类软件测试的技术要求、测试策略、环境构建及实践者方法。

由于编著者水平有限,虽笔耕不辍,数易其稿,难免萧兰并撷,珉玉杂陈,不当之处,恳请读者批评指正。作为一门快速发展与持续演进的学科,本书只是软件测试技术研究和实践的一个起点。以有限的时间和认知,探索软件测试的无尽难题,路漫漫永难穷尽,还需要业界和同仁们的大力支持和共同努力。

在本书的编著过程中,参考并采用了中国船舶工业软件测试中心的部分研究成果,对相应项目组及成员艰辛的探索、智慧的创新、卓越的成果致以由衷的敬意!另外,中国船舶工业软件测试中心费琪高工提供了部分静态分析案例,哈尔滨工程大学韩启龙教授、Shopify公司数据分析师Sun ruolun审阅了书稿并提出了建设性的意见和建议,电子工业出版社徐蔷薇编辑,精心策划、悉心指导、逐字审阅,保证了书稿的编辑出版质量,在此一并致谢!在本书的编著过程中参考了相关网络文献,难以逐一列出,特向作者及信息发布者致谢!

编 著 者

2024年5月