1.4.2 软件测试发展趋势
无论是基于技术发展还是工程实践视角,分析软件发展需求及其面临的挑战,在可预知的未来,数字化、敏捷化、自动化、智能化、服务化是软件测试发展的主流方向,是驱动软件测试创新发展、融合发展、跨越发展的重要抓手。
1.4.2.1 数字化
软件测试不仅需要关注程序的静态特性,更加需要关注动态环境、任务场景下的数据及环境配置、操作使用、系统效能、交付能力等问题。等比例构建真实测试环境既不经济,也不现实。基于系统工程业务数字化及系统开发模式转型,软件测试从线性、以文档为中心的过程向动态、互连、以数字模型和虚拟现实为中心的生态系统转型,虚拟测试、数字化测试迎来了重大发展机遇。
数字化测试是基于测试需求,构建数字化模型及仿真环境,以替代真实环境,获得等价的测试数据,驱动测试。数字代理、数字孪生、不确定性量化、数字化决策、数字化试验鉴定计划(Test & Evaluation Main Plan,TEMP)等,为数字化测试转型奠定了坚实基础;以模型为中心,对测试过程及测试策略进行持续动态调整,适应软件需求的变化及迭代升级;以虚拟现实为手段,基于价值的决策分析、贝叶斯信任网络等,基于数据驱动的测试风险分析和决策成为可能;使用数字化手段对测试能力及测试过程的不确定性进行度量,获得软件系统性能参数的敏感性、实现需求、过程及测试结果的数字化表征,支撑测试过程虚拟化及持续改进。
数字化测试与虚拟测试相辅相成,旨在突破经典软件测试对时空的限制,实现操作的交互性,测试输入、测试结果的仿真性。首先,基于软件设计分析,生成模块表、变量表、指令描述表、调用关系树,逆向生成可视化程序流程图,与软件系统动态关联,实施静态分析。其次,基于数据源特性,以软件缺陷模式,构造软件系统运行环境和任务场景,通过双向查询与实时同步、CPU模拟、存储器模拟、时钟模拟、中断控制模拟、通信模拟等,生成测试用例,注入测试数据,实现软件系统动态模拟。最后,基于系统任务场景、质量目标、使用模式、运行剖面等,逆向生成流程图标识语言,使用流程图标识语言生成流程图块文件,将流程图块文件与系统数据流耦合,实现系统能力验证。
1.4.2.2 敏捷化
轻量级、能更好适应客户及市场需求变化、加速价值交付及迭代更新的敏捷软件开发快速发展,DevOps文化普及,持续集成和持续部署已成为软件开发的标准实践。为适应这种一切敏捷、快速迭代、频繁发布的软件开发模式,软件测试敏捷化,势在必行。
知名咨询公司Accenture将敏捷测试定义为:遵循敏捷开发原则的一种测试实践。敏捷测试将测试集成到软件开发流程,贯穿于软件生命周期过程,自我驱动、灵活赋能,持续响应客户反馈,加速价值交付;基于软件迭代开发,同步进行测试迭代,快速反馈质量状态,不断修正质量指标,及时调整测试策略,持续改进测试过程;同步组织实施测试迭代,强化与软件开发的合作,强化测试的持续性和跨职能团队的协作,使得软件测试具有更强的协作性、更短的周期性、更灵活的计划性、更高效的自动化等特征。
敏捷测试以用户需求为驱动,面向被测系统,基于确定的测试过程及测试模式,设计多个冲刺(Sprint)以满足迭代目标,将测试安排在每个敏捷迭代中,持续响应频繁反馈,持续发布软件增量,迭代验证进展,冲刺验证价值。迭代开始时,可能是粗粒度测试,在Sprint 0及后续Sprint中,则为适时(Just-in-Time)式测试,基于不断修正的质量指标,不断迭代,直至满足测试充分性要求。
就测试技术及方法而言,敏捷测试同传统软件测试并无本质差别。传统软件测试技术和方法在每个Sprint迭代中,都有用武之地。敏捷测试遵循敏捷宣言,采用敏捷模式,同敏捷开发方式紧密融合,契合敏捷开发周期,与开发并行,能够尽早检出问题,避免缺陷堆积,缩短价值交付周期,规避系统风险。敏捷测试强调质量属于每个角色的职责,开发、测试、质保、管理等所有人员对软件质量负责。敏捷测试推崇轻量级的管理模式,摒弃定义繁杂的测试流程和缺陷管理流程,裁剪繁杂的测试过程文档,让测试工作化繁为简,轻装上阵。敏捷测试必将推动软件测试模式的深刻变革,测试理念的重大变化。
1.4.2.3 自动化
推进软件测试自动化,提质增效,是软件测试人的不懈追求。软件测试自动化是在自动化测试框架下,基于人工智能等技术,使用自动化测试工具,通过可视化界面或命令,自动生成测试用例、测试数据、测试脚本,按预定计划组织实施软件测试,实现软件测试目标定位、测试分析、测试设计、测试执行、质量度量、过程监控、分析评估等全流程自动化,是软件测试发展的重要趋势,是测试组织技术及能力成熟度的重要标志。自动化测试框架是一组抽象构件及构件实例之间交互的方法,提供脚手架命令生成一个自动化项目,实现依赖自动组装,支撑系统可重用设计,主要包括脚本模块化架构、测试库架构、关键词或表格驱动架构、数据驱动架构等类型。
软件测试自动化包括浸入式和非浸入式两种类型。浸入式测试需要修改软件代码或控制其运行环境,非浸入式测试用于监视和检查软件,无须修改软件结构及代码。软件测试自动化涉及测试技术、测试体系、自动化编译、持续集成、自动发布等测试系统,以及自动化测试流程改进、自动化基础设施建设等所有方面及环节。
近年来,软件测试自动化发展取得了一系列重大突破。例如,基于遗传算法、爬山法等技术,自动生成满足某一软件成分的测试用例,支撑逻辑覆盖测试用例自动生成和自动执行;又如,ChatGPT将文件上传至活动对话工作区,基于代码解释器的扫描代码,自动完成代码静态分析和代码审查,实现逻辑驱动测试自动化的新突破。与此同时,基于分布式自动化测试框架和测试中台,基于BDD端到端的自动化测试、DevOps自动化测试、iOS UI自动化+基于docker的分布式测试、基于人工智能的超级自动化测试等技术取得重大进展,为软件测试自动化发展注入了创新动能。
事实上,即便是最有可能实现自动化的测试执行也还难以真正地自动化,因为测试执行是一个不稳定的过程,需要人工干预,况且自动化测试脚本也难以自动生成,测试结果亦需要人工分析。对于千差万别的软件系统及测试需求,基于测试工程师的智慧和经验,创新自动化测试技术,使用自动化测试工具,往往会产生意想不到的效果,但完全自动化的软件测试可能事倍功半,除非是对于特定软件系统的特定测试需求,讨论测试自动化,似乎并无太大意义。软件测试是基于创新、创造的人类智慧活动。超级自动化或许只是一个美好的梦想。即便前路迷茫,软件测试自动化发展,势不可挡。
1.4.2.4 智能化
人工智能在软硬件两端赋能,构筑了较完善的智能基础软件体系、协同的上层软件生态及相互衔接的下游价值链闭环,形成了涵盖计算芯片、开源平台、基础应用、行业应用、智能产品等的人工智能产业链。面对人工智能的高速发展,软件测试面临着两个方面的挑战:一方面是如何创新测试技术,对智能软件进行测试,保证其可行性和能力;另一方面是如何应用人工智能技术及成果,推进软件测试的智能化发展。
1.智能软件测试
智能软件是基于数据驱动的构建,由算法模型、基础设施、数据及产品服务构成,具有自主感知、智能判断、自主决策、行为控制等功能特征,以及自主性、学习性、协同性、自适应性等技术特征。传统软件系统是基于控制流和数据流构建的业务处理系统,智能软件则是一个智能模型嵌入的复杂系统,是基于数据驱动构建的参数化数值计算系统,软件特征及生命周期过程较传统软件存在着显著差异。智能软件生命周期过程如图1-5所示。
图1-5 智能软件生命周期过程
智能软件测试尚处于发展阶段,目前主要集中于智能软件缺陷定义、失效行为刻画、测试准则构建等方面,较传统软件测试,智能软件测试面临着新的需求和挑战。第一,智能软件是一种动态系统,系统行为具有不确定性、自适应性等特性,系统能力随着学习时间增长而增强,难以精确地描述或表达其目标任务、动态增长的能力及系统行为,受测试样本及测试资源制约,而又无法通过等价类划分等方法大幅降低样本量,难以对测试结果进行准确判断,难以对软件质量进行分析评价。第二,算法模型是智能软件的核心,但模型的统计学本质使得智能软件的输出具有不确定性,难以通过测试发现测试预言数据驱动特性、内部行为分析方法缺失等问题,测试结果不稳定,且可理解性,鲁棒性差,需要基于大量数据,通过大量测试验证其普适性。第三,智能软件通过数据驱动建模实现预测或决策,运行于非确定性开放环境,数据驱动建模使得系统行为随训练数据改变而改变,如何构造测试数据、感知环境、交互环境、上下文场景,是保证有限测试及测试有效性的关键。第四,传统软件缺陷是代码中能够引起一个或一个以上失效的错误的编码,智能软件缺陷不再是显式的代码或参数错误,具有非确定性和确定性相结合的缺陷触发与传播机制,缺陷识别、缺陷单位、缺陷分类、缺陷分析、缺陷处置愈发困难。第五,智能软件测试依赖于大数据,基于大数据的自动产生、分析、呈现等技术,能够有效地验证智能软件的可信性及交付能力,但测试工作量巨大。
基于智能软件特征、内部和外部形态及数据和模型视角,从数据对模型的影响、模型对数据的作用两个方向,可将智能测试划分为数据分布多样性驱动测试、数据边界稳定性驱动测试、数据语义一致性驱动测试、数据精度适应性驱动测试四种类型。智能软件测试分类及内容如图1-6所示。
基于测试对象视角,智能软件测试可以划分为智能算法、智能算力、数据质量、智能产品测试四种类型及智能化水平评估。智能算法是智能软件测试的核心内容,主要包括智能算法正确性、算法收敛性、算法鲁棒性、算法依赖性、算法可增强性、算法效率等方面的测试。例如,面对智能算法的不确定性、难解释性等特征,基于IT/ECSA 1021、ISO/IEC 39119、ISO/IEC 25059等标准规范,建立面向智能算法的测试流程、覆盖准则,构造如图1-7所示的智能算法测试系统,对智能算法的准确性、对抗样本攻击、覆盖率等进行多维度测试,支持多种模态数据集对抗曾广和非对抗曾广。
图1-6 智能软件测试分类及内容
图1-7 智能算法测试系统
2.测试智能化
软件测试智能化是应用人工智能技术,对软件系统进行智能分析和测试,降本增效,加速软件交付的测试实践,是软件测试领域的一个重要发展趋势。目前,软件测试智能化发展主要集中于:一是将人工智能技术同软件测试策划、测试设计、测试执行、测试分析、缺陷管理等结合起来,推进全程自动化测试、智能化分析,改进测试过程;二是将软件开发、测试过程中形成的资产转换成规则和知识,构建测试模型,基于机器学习,实现测试用例、测试数据、测试预言等自动生成,以及缺陷和日志智能分析、测试设计与测试分析优化,如Eggplant AI导入已有测试资产,创新模型,使用智能算法选择最佳测试集并进行测试用例排序;三是基于图像识别、语音识别、知识图谱、自然语言处理等技术,开发应用智能测试工具,提高测试覆盖率和测试效率;四是通过领域知识图谱工程、代码深度分析,实现精准测试及缺陷定位,推进基于测试驱动的软件质量工程发展。智能化软件测试的基本原理如图1-8所示。
目前,神经网络和遗传算法在智能算法、智能算力、数据质量、智能体测试及智能化水平评估等方面得到了较好应用。其中,神经网络在GUI测试、内存使用测试、分布式系统功能验证等场景及缺陷定位与测试分析等方面取得了重要进展。遗传算法可以用于选择最优的单元测试用例,也就是单元测试的最优输入集。同时,利用人工智能还可以优化测试工具,将软件测试的上下文与测试用例结合起来,选择最优测试用例集进行测试。
未来,随着人工智能的深化发展,在特定的业务领域能够持续提升机器的认知能力,实现从感知智能向认知智能演化,使得测试机器人能够对领域知识进行深刻领悟,能够对业务知识进行深刻认知,实现真正意义上的测试智能化。
图1-8 智能化软件测试的基本原理
3.基于大模型的软件测试
大模型是具有大规模参数和复杂计算结构,由深度神经网络构建而成的机器学习模型,通过海量数据训练,学习复杂的模式和特征,具有强大的泛化和智能涌现能力,已在自然语言理解和生成、机器视觉、语音识别、科学计算、智能推荐等领域得以广泛应用。ChatGPT的横空问世及一批类似大模型的迅猛发展,推进信息社会迈向以大模型为主导的新发展阶段。同样,这对软件测试带来了重大影响和深刻变革。
基于大模型的软件测试是利用大模型的上下文理解能力、高效的学习效率、多模态处理能力、自动化性能,基于海量数据训练,通过对被测软件的理解,生成有针对性的测试用例、多样化的测试输入、逼真的应用场景,驱动测试,实现软件测试的自动化、智能化和集成化,提高测试质量和效率。
(1)自动化:大模型具有强大的自然语言理解与处理能力,能够自动地理解软件需求,生成测试需求和测试用例,自动地执行测试用例,收集和分析测试结果,生成测试报告。
(2)智能化:通过大模型的深度学习及模式识别能力,智能生成模拟数据,用于各种场景及边界条件下的软件测试,提高测试覆盖率;对测试结果进行深度分析,以发现异常和潜在的软件缺陷,提高测试的可信性。
(3)集成化:大模型能够将软件测试过程同软件生命周期过程紧密集成,实现测试与开发实时互动和反馈,改进开发过程,提高软件质量。
目前,基于大模型的软件测试,研究和实践的重点包括两个方面:一是将传统软件测试技术与基于大模型的生成技术相结合,生成多样化的测试输入,实现精准的测试及覆盖率目标;二是基于历史软件缺陷数据训练,生成能够更加高效触发错误的测试输入。目前我国已在测试用例生成和执行、文本输入生成、智能缺陷检测、缺陷自动修复、自动回归、智能协作等方面取得了显著成效。中国科学院软件研究所、澳大利亚Monash大学、加拿大York大学的研究团队,基于软件测试和大模型视角,分析了截至2023年10月30日的102篇论文,总结出了如图1-9所示的大模型在软件测试领域的应用情况。
由图1-9可见,大模型在软件测试领域的应用主要集中于测试用例生成、测试预言生成、缺陷分析、缺陷修复等软件测试生命周期的后端。例如,在大量的大模型中,Codex和CodeT5是基于多种编程语言代码语料库训练得到的大模型,能够根据自然语言描述生成完整的代码片段,适宜于基于源代码的测试,对于测试用例生成,能够比较准确地理解领域知识及软件项目和代码上下文的信息,生成准确、全面且有针对性的测试用例。但遗憾的是,大模型在测试需求分析、测试计划制订等方面尚未取得实质性进展。
尽管大模型在软件测试中展现出了巨大的潜力,也进行了大量成功的实践,但基于大模型的软件测试,尚处于探索和起步阶段,在复杂程序结构理解和处理、高覆盖率、测试预言、精准评估等方面,还存在着大量需要研究解决的问题。展望基于大模型的软件测试发展,一是通过预训练和微调及提示工程,基于零样本或少样本学习、自我一致性、思维链、自动提示等技术,调整大模型行为,以适应特定的领域和任务,提高大模型的理解和推理能力。二是同变异测试、差分测试、蜕变测试、程序分析、统计分析等传统软件测试技术进行融合,进一步提高测试覆盖率和测试质量。
图1-9 大模型在软件测试领域的应用情况
1.4.2.5 服务化
软件测试服务化是指将测试策划、测试设计、测试执行、测试总结等过程资产作为独立的服务进行封装,将测试作为一种服务(Test as a Service,TaaS),通过专业测试团队或工具,为客户提供定制化的解决方案即定制化服务,提高测试效率,降低测试成本。它是云计算和软件测试相结合的一种新型服务模式,具有定制化、专业化、集成化、系统化、扩展化等特征,正在成为推进软件测试行业专业化发展源动力,是软件测试的重要发展趋势。
在企业或软件开发组织内部,基于测试中台,测试人员、开发人员、管理人员及相关方能够通过应用程序编程接口(API),按需自动获得测试能力,使得开发人员能够尽早关注并开展测试,根据测试需求及其变化情况,快速调整测试资源和服务内容,推进测试左移及全程质量管控。图1-10展示了一个软件测试中台服务示例。
图1-10 软件测试中台服务
一个在软件测试领域进行深入研究和最佳实践的时代已经到来,制约软件测试发展的重大关键引领技术正在被逐一突破,软件测试数字化、敏捷化、自动化、智能化、服务化发展,势不可挡,一个创新发展、融合发展、跨越发展的时代已然来临。