行业现状
软件行业长期存在一个痛点,即测试效果无法度量。通常依赖于测试人员的能力和经验,测试结果往往不可控,极端情况下同一个业务功能,即使是同一个人员在不同的时间段,测试场景和过程也可能不一致,从而无法有效地保障软件产品质量。
质量总监总是抱怨:每一次版本发布时,时间并不是很充分,我们不确定这些需求代码变动到底影响范围有多大,无法精准地评估出测试范围,要么执行完整的全回归测试,花费大量的时间,严重影响交付效率;要么靠个人经验和主观能力,有选择的验证部分功能,很容易忽略出问题的业务场景,导致漏测现象和bug泄露。
测试人员总是抱怨:这个任务明明只需要改A需求,为啥会影响到B需求?咨询对应的开发人员,反馈为所有功能都需要重测。
多年来,许多大型企业都尝试过各种不同的方法,比如提升测试人员技能、标准化流程、加大需求评审的投资等等,但这些措施只能暂时缓解问题,最终软件产质量还是不尽人意。
有没有一种解决方案或者工具可以量化、数字化地解决这个问题呢?
可度量的测试体系-精准测试
先来回答一下什么叫精准测试,它涉及软件测试、数据分析、机器学习等多个交叉领域。其目的是通过收集和分析测试数据,预测软件缺陷的位置和严重程度,从而提高测试效率和准确性。
精准测试主要包括以下几个方面:
1.测试数据收集与管理
收集覆盖面广、质量高的测试数据是实现精准测试的基础。测试数据包括测试用例、代码变动、业务工单、API接口等所有过程数据,这需要采用自动化测试工具、人工测试等手段,在不同的测试阶段获取足够的有效数据。同时,建立测试数据管理平台,对测试数据进行分类、存储、分析和共享,以便在测试过程中为测试人员提供支持。
2.测试用例优化
基于机器学习和数据挖掘技术,分析历史测试数据,挖掘出潜在的测试用例覆盖不足和冗余。通过对测试用例进行优化,可以提高测试覆盖率和降低测试成本。
3.缺陷预测
通过对测试数据的分析,建立软件缺陷预测模型。该模型可以根据测试数据预测软件中可能存在的缺陷位置和严重程度,从而帮助测试人员优先处理高风险的缺陷,提高测试效率。
4.测试人员辅助
通过大数据和机器学习技术,为测试人员提供辅助决策支持。例如,在测试过程中,根据测试数据为测试人员推荐合适的测试策略、测试用例和缺陷处理方法等。
5.可视化分析与展示
将测试数据进行可视化处理,使测试人员能够更直观、快速地了解软件测试状况。可视化分析可以帮助测试人员发现测试过程中的问题和改进方向,提高测试效果。
精准测试的目标?
将需求、代码、用例建立映射关系,通过数字化、可量化的数据判断,实现代码覆盖率的可衡量性,从而提高测试效率,提高版本质量。
精准测试从2012年开始提出和发展,至今已经过了10年多的历程,越来越多的企业发现它的价值点,但是落地却很困难,行业内的质疑声也一直存在,并没有形成一个通用、完整的解决方案,无法适配不同公司的产品业务。
总结一下,难点主要有如下方面:
如何解决这些难点?
打造精准测试框架是解决这些难点的最重要和有用的方案。为了实现这一目标,我们可以围绕三个核心特征来定义企业级平台:平台底座、价值变现和用户体验。
平台底座是技术架构的基础构建,它包括四个主要部分:数据采集、代码插桩、正向追溯和数据存储。
数据采集:通过过多种消息中间件,利用流量隔离的技术并行采集,自动化采集数据并入库,提升执行效率,解决数据采集困难的问题。
- 使用调用链做流量隔离,实现并行采集,这也是精准测试落地到人工测试的基础条件,其最大的优势为:
-
有效隔离不同业务、不同IP、不同人员的流量,减少流量之间的干扰,实现个人测试流量的单独采集。
-
可以有效优化系统性能,减少资源浪费,提高采集的效率。
- 使用类似kafka做消息管道,利用其高可靠,高性能的优势,支撑了每秒百万级的消息处理。
代码插桩:使用JAVA Instrumentation,无侵入的对业务代码插桩,在容器化基础上,进一步标准化启动脚本,只需修改环境变量即可控制是否插桩使用调用链数据或者Agent插件注入来形成插桩方式。
- 无侵入性:此技术不会改变业务代码,不会对应用程序的功能产生负面影响。
- 灵活性:通过容器化、环境变量控制动态插桩的方式,可以在不修改代码的情况下,根据环境轻松切换不同的插桩策略。
- 标准化和可扩展性:使用容器化技术和标准化启动脚本,可以使插桩过程可复制,方便在多个项目或环境中应用。
正向追溯、反向追溯:通过数据采集和存储建立的映射关系以及覆盖率报告,可以更好地理解业务需求与代码实现之间的关系,评估测试的效果,并扩展建立需求、用例、代码片段(块/行)和版本基线的基础映射关系,通过正向追溯和反向追溯的方式增强项目管理、变更管理和持续改进的能力。
数据存储:精准测试过程中会产生大量数据,链路结构的特性使得数据存储和管理变得复杂。为了应对这种情况,建议使用非关系型数据库进行数据存储。例如,可以使用类似ElasticSearch、Neo4j、ClickHouse等数据库来支持精准测试数据。这些数据库能够处理百亿级别的数据量,并实时维护覆盖率数据的追溯关系。通过使用这些数据库,我们可以提高数据存储和查询的性能,更好地管理精准测试数据。
- 高性能:ElasticSearch具有强大的全文搜索功能和数据分析能力,而Neo4j则擅长处理图结构数据,ClickHouse具备高压缩比,低存储成本,都是为处理大规模数2据和复杂查询而设计的。
- 可扩展性:具有水平扩展的能力,可以随着数据量的增加自动进行分片和负载均衡,确保系统的可伸缩性。
- 实时性:可以实时更新和查询数据,对于需要实时反馈的场景非常适用。
- 开放性:开源组件,可以自由使用和定制,同时也提供了丰富的API和工具,方便进行二次开发和维护。
价值变现:精准测试平台的价值主要表现在针对企业不同实际业务,通过多元化业务场景功能来实现。例如覆盖率视图等基本价值能力在此不再赘述,本段重点介绍代码染色和用例智能推荐。
代码染色:代码染色是一种通过分析代码逻辑和结构,为代码片段赋予颜色标记的技术。精准测试平台利用代码染色技术,通过Bug泄露情况,代码变动频率等多种维度的数据聚合,将代码中的重要程度直观地展示出来,帮助开发人员快速发现和定位问题。同时,代码染色还可以提示开发人员某些代码片段可能存在的潜在风险,从而提前预防和解决潜在问题。
- 故障率维度:根据数据积累,每个故障泄露对应的代码文件,可以定义文件引起的故障率,一般来讲,此类高危定义的权重最高。
- 外部依赖维度:核心程序被调用情况,可以在一定程度上定义代码的重要程度,通用的就是扇入扇出。
- 修改频率:每个文件的修改频率,在一定范围内会影响Bug的泄露,一般修改频率越高,引起问题的几率会增大。
- 自身代码复杂程度:代码的易维护程度,越难维护出问题几率越大,比如圈复杂度,重复代码度。
用例智能推荐和变更范围分析:常见的技术是使用建模语言(UML)和工具来创建业务模型、用例模型和代码模型,通过类图和业务模型之间的关联来建立业务和用例与代码之间的映射。
- 根据需求、用例和代码变动,从追溯映射数据库中智能匹配现有场景用例,用例最小集+有效场景覆盖,并反馈给开发和测试人员,让测试更清晰和准确,有效提升测试效率。
- 依据代码变动片段信息,分析出关联影响,提供变更的函数、接口、功能、菜单以及对应的业务列表,精准地评估影响范围,同用例智能推荐融合使用。
用户体验:用户体验是精准测试落地的关键点,我们可以从易用性和交互性着手,尽可能的降低测试/开发的额外工作量,降低额外的资源和环境,开箱即用,从而帮助用户提高工作效率、增强用户满意度、降低错误率,我们可以在下面两个方面考虑:
系统快照:将用户的测试操作,通过插桩和流量监控,形成step by step的测试用例。
- 一键生成文本测试用例。通过浏览器插件事件监听API,流量监听API,以及本地Gotest流量监听工具,自动记录人工测试的操作过程。
- 采集代码覆盖率信息。将文本用例,手工测试,代码覆盖率三者整合,可以很大程度上提高测试效率,丰富用例代码关系库。
插件能力:提供浏览器插件、任务单一键录制、接口插件等能力,用户无需额外投入学习成本,解决易用性低的痛点。
最终形成DevOps的全场景价值平台,解决价值链单一问题,实现从数据版本匹配覆盖率到整合需求任务单管理、嵌入DevOps流程,形成质量门禁和多维度度量统计视图的全方位改进,实现全链路效率提升。通过精准测试完整体系,可以更高效地管理和监控软件开发过程,提高软件质量,降低开发成本,同时增强团队协作和沟通。
持续思考
采集侧:考虑无调用链应用的接入,适配更多的业务产品情况,进一步提升精准测试的覆盖范围
易用性:易用性能力的进一步提升,在任务单处理环节,用户可以一键式的采集流量信息;根据流量信息自动生成测试用例和测试快照,进一步提升测试效率
AI分析:用例推荐更加AI化,同GPT融合,能够分析出有效用例
缺陷分析能力:基于业务场景、任务单、测试用例数据,能够分析出漏测点,提示并补充测试