一个特定的软件系统,在确定的任务场景及使用环境下,基于确定的运行流程,实现一个或多个特定的目标。在不同运行流程下,系统输入/输出及软件行为存在差异。测试策划过程中,必须充分考虑不同运行流程及流程的转换和组合,尤其是对于系统测试,应对不同运行流程驱动下的系统能力进行验证。系统运行在一个确定的剖面下,软件测试不仅需要验证其符合性,还需要验证基于剖面驱动的系统功能性能及系统能力的实现程度。对于同一系统,基于不同的操作组织、运行流程,系统行为存在差异,需要验证这种差异对系统行为的影响及可能导致的使用风险。
运行流程、操作使用决定了系统的运行方式、运行状态、健壮性及质量风险。基于系统的外部质量特性,关注系统的运行流程和操作使用,在系统测试过程中,有针对性地强化基于流程的测试,基于能力路径的测试及基于剖面的测试,再造测试流程,不仅有利于改进测试过程质量及被测系统的使用质量,也有利于软件测试组织的组织和结构治理。
在软件生命周期过程中,软件测试是一个螺旋上升的迭代过程。软件测试始于螺旋结构的中心,对于软件单元,以代码质量为关注的焦点,组织开展单元测试。这是软件测试的基点,也是软件测试的起点。软件及系统集成过程中,面向软件体系结构的设计构造及内部接口,开展集成测试,这一过程持续沿着螺旋向外演进,直到集成结束。确认测试关注的重点是软件系统功能的实现和性能的达标情况,验证的是需求的符合性,是一个沿着螺旋向外继续循环上升的过程。最后,以使用质量为关注的焦点,在真实环境下组织实施系统测试,对系统的外部接口、系统运行、操作使用、用户体验、交付能力等进行测试验证。测试策略螺旋结构模型如图4-18所示。
图4-18 测试策略螺旋结构模型
编码实现阶段,面向每个独立的软件单元,采用控制流分析、数据流分析、程序变异分析及符号求值等逻辑驱动测试技术,验证程序逻辑的正确性。Edward Miller认为,如果分支覆盖率不小于85%,则分支覆盖检出的缺陷将是功能测试检出缺陷的两倍。随着软件开发技术及方法学的发展,尤其是智能化软件开发技术的应用,程序结构性问题总体上呈下降趋势。由于软件系统结构及缺陷产生机理的高度复杂性,执行路径并不能完全准确地刻画其失效行为,应在逻辑驱动测试及整个测试开销间寻找平衡,不能过犹不及。
集成测试旨在检出与系统功能实现、设计结构、内部接口等相关的问题,通常使用功能分解、等价类划分、边界值分析、判定表、因果图、随机测试、正交试验等测试技术。为保证重要分支覆盖,逻辑驱动测试亦不可或缺。对于软件系统,基于系统规格,对系统功能性能、操作使用、系统效能等进行测试验证,在确认测试的基础上,数据驱动测试及基于能力路径等测试技术是行之有效的。
系统测试需要验证所有元素能够正确、有效地完成整个系统的功能性能、运行模式、操作使用及环境适宜性、系统交付能力。最后的高级别测试步骤已跳出软件工程的边界,在一定意义上属于质量工程范畴。软件测试不仅是对实现错误的检测及需求符合性验证,更需要关注被测系统的操作控制、使用环境、数据环境配置等问题,以及特定环境中的失效机理、失效模式,建立缺陷预测及评价模型,实现测试、预测及评价的良好生态。
基于瀑布模型的软件测试过程模型,是一种线性、以文档为中心的测试过程模型,已有大量著作进行了系统介绍,在此不赘述。基于瀑布模型的测试过程模型,有悖于软件质量工程,存在着明显的局限性。随着敏捷开发、微服务架构、云原生应用等开发技术及软件测试技术、软件质量工程技术的发展,基于数据和能力驱动,软件测试流程向动态、以数字化模型为中心的敏捷形态转变,将测试过程活动独立出来,形成一个独立流程,构建软件生命周期过程中某阶段的一次测试循环。基于能力驱动的测试过程模型如图4-19所示。
图4-19 基于能力驱动的测试过程模型
测试过程模型旨在定义测试流程,确定测试过程的输入/输出、过程活动、控制要求、控制方法,对测试过程实施有效控制,确保测试过程活动有效展开,实现过程改进、过程能力提升与过程活动增值。软件测试过程中不同活动的输入/输出及控制要求如图4-20所示。
软件测试不是按部就班的程序化操作和流水线作业,是一个持续创新、深入思考、不断质疑的组织创新及最佳实践过程,不仅需要专业的技能,更需要倡导匠艺精神,培育并传承优良的文化,建设一支主动学习、勇于创新、不断进取、团结协作的高素质团队。图4-21给出了一个测试团队技能图谱。
图4-20 软件测试过程中不同活动的输入/输出及控制要求
图4-21 测试团队技能图谱
项目启动前,组建测试团队,确定项目负责人及项目组成员、角色定义、能力要求等是测试策划的重要内容之一。一般地,项目组由项目负责人、测试人员、技术支持人员、监督管理人员、质量保证人员、配置管理人员等构成。角色定义旨在明确项目组成员的分工和职责,各司其职。在软件开发组织内部,对于可靠性、安全性攸关的软件系统或条件较好的软件开发组织,可以为每一个开发小组配备一名或若干名专职测试人员或独立的测试小组,同步组织开展单元测试、集成测试、确认测试和系统测试。当然,这并不能代替开发团队的自测试,也不能免除开发团队的自测试责任,同时还要规避测试与调试的交织。对于软件从业人员较少或严重缺乏测试人员的开发组织,单元测试、集成测试可以由开发团队自行完成,但应尽可能由不同人员交叉进行,即结对测试。对于独立的第三方测试机构,应建设包括测试策划、测试设计、测试执行及技术支持、质量保证、配置管理、样品管理、保密管理等的测试团队,团队成员构成及技术能力要求应满足实验室认可准则及相关标准规范要求。