基于风险的测试策略是通过对系统使命任务、业务流程、任务场景、使用环境等的分析,确定质量风险及风险等级,然后依据质量目标、测试能力、潜在风险及功能的可见性、使用频率、故障模式、修复成本等要素,识别风险影响因素,基于缺陷触发的可能性及其影响,构建风险评估矩阵,确定主要风险因素,规定最低程度的测试充分性及需求跟踪方法,建立如图4-8所示的基于风险的测试策略矩阵。
图4-8 基于风险的测试策略矩阵
基于风险的测试策略是根据风险严重等级,确定测试优先级、测试次序及测试充分性要求,确保高概率质量风险得以高测试覆盖,规避抽样验证风险。风险越高的测试项,测试优先级及测试覆盖要求越高,需优先配置更加充分的测试资源,构建更加完备的测试环境,使用更加先进的测试技术,安排专业水平高、业务能力强的测试人员进行重点测试。对于高风险测试项中所发现的缺陷及发生的偏离,以“定位准确、机理清楚、问题复现、措施有效、举一反三”为原则进行归零处理,并回溯到测试用例及系统需求。与此同时,基于持续的风险分析评估,持续完善风险评估矩阵,持续降低风险。
例如,基于测试工作量评估,某软件系统测试需要5个工作日,但任务紧急,要求2天内完成测试。若按既定计划进行,测试覆盖率仅为2÷5×100% = 40%,风险不可避免。于是,构建基于风险的测试策略,分析确定高风险测试项,按80/20原则,第一天执行20%的测试用例,覆盖80%的质量风险,然后对剩余80%的测试用例进行分析,第二天执行其中20%的测试用例,覆盖剩余20%风险的80%,即再覆盖16%的风险,总体上风险覆盖率达到96%。尽管未能实现100%的风险覆盖,但在测试时间压缩60%的情况下,仍然实现了较高的覆盖率,并且基于高风险优先的原则,严重缺陷及重大偏离所导致的风险基本被排除,基本实现了测试目标。事实上,在实际工作中,因为时间进度、资源配置等制约,如果能够基于风险进行测试策划并组织实施,则能够在较大程度上对风险进行管控。基于风险的测试策略如图4-9所示。
图4-9 基于风险的测试策略
软件测试是基于软件行为建模的数据抽样验证。抽样本身就意味着风险,况且测试所需时间往往远大于可获得的时间,测试资源也同样如此,质量风险处于不可控状态。质量风险意味着用户使用系统的风险及开发方交付系统的风险。基于风险的测试策略,以风险为导向,将有限的测试资源集中于软件系统的关键功能及重要性能等高风险特性测试,从而保证测试质量。
对于特定的软件系统,各利益相关方关注的是:能否在确定的条件下,在给定的时间内,完成测试任务,保证测试的充分性、完备性、有效性、可信性及规避各利益相关方风险。诚然,能否实现测试目标,与系统特征、系统行为、约束条件等密切相关,这是“测什么”的问题,通过测试需求分析,予以识别、界定和确认,如同中医通过望、闻、问、切,对病人进行诊断,确定病灶和病因。这取决于测试人员的技术水平、业务技能及对测试架构、领域知识掌握的能力。测试需求确定后,基于确定的目标,制定测试策略,也就是“怎么测”的问题。类似于病人确诊后,用什么药,做什么手术,治疗几个疗程的问题。这不仅取决于测试人员的创新及应用实践能力,还取决于测试设备、测试工具、基础设施、测试资产、环境构建的完备性、先进性、适宜性。显然,作为一种方法论,测试策略有千万种,但无论使用哪种,都离不开测试能力的支撑。软件测试,取决于能力,受制于能力,决定于能力。
基于能力的测试策略是以能力为出发点,以能力为落脚点,即基于软件测试团队能力、基础能力、技术能力、过程能力、管理能力等固有能力,进行能力需求分析及风险评估,制定并实施测试策略。表 4-1给出了基本的软件测试能力分类。
表4-1 基本的软件测试能力分类
对于本书3.2.3节构建的类—实践域—实践(CRP)软件测试能力评价体系,不论是Ⅰ级类指标,还是Ⅱ级实践域指标,抑或是Ⅲ级实践指标,其实现与评价都有赖于团队能力、基础能力、技术能力、过程能力、管理能力等固有能力。当然,注重专业能力、专项能力、特色能力、特种能力建设,将不同能力进行综合,方能实现测试能力的最大化、专业化和特色化。
对于专业软件测试机构,需对测试能力保有、变化情况及适宜性,进行定期分析评价,调整组织策略,持续保持并改进测试能力。当测试能力不能满足测试需求时,应有计划地配置或增强测试能力。显然,不可能无限制增加测试人员或测试工具,而是应该不断挖掘潜在能力、不断提高技术能力、改进流程治理能力,弥补能力不足并持续增强测试能力。例如,基于不同业务场景,CPU密集型、内存密集型、网络密集型系统对测试环境及资源需求可能大相径庭,面对混合部署交叉、测试环境扩/缩容、多环境代码不一致、稳定的线下测试环境缺乏等问题,一个基本的想法就是增加服务器,搭建满足要求的测试环境,但会显著增加测试成本,有悖于系统工程思想。当基础能力不足时,可以采用技术手段予以弥补。例如,通过Docker对整个工程进行重构,能够解决应用分发、部署和管理等问题。这不是捷径,而是技术能力的威力。不同能力相互关联,相互制约,任何一个能力的突破,都将推进整体能力的提升。当然,这需要测试人员具备、掌握并驾驭相应能力的能力。