测试智能分级与风险评估在商业平台的应用探索
小编有话说
相信在日常的测试活动中,大家多少会遇到以下几种场景:
研发的某些“很简单”的代码变更,测还是不测,不测的话风险怎么控制;
某些版本交付,都经过大量的测试,但谁能保证线上有多大风险或还有多少潜在的风险;
随着自动化测试程度的不断提升,越来越多的质量保障无人介入,但自动化测试的有效性谁去保证(当前更多考虑的覆盖率或者用例是否通过);
某些类型的自动化或测试执行,长期召回不了问题,逐渐成为“鸡肋”,但是又不敢轻易“下线”;等等。
带着这些问题,百度智能测试团队于2019年底开始致力于研究质量度模型,希望通过质量度模型可以实现:
通过获取研发过程数据+自测+自动化数据,用质量度模型决策是否需要跟进后续测试,以减少不必要的投入和降低测试周期;
通过质量度模型,获取所有测试行为后的数据+研发数据,预估风险度,以进一步提升交付团队对风险把控的信心和召回可能漏出的问题;
通过质量度模型+自动化测试任务特点,智能决策任务是否需要执行、执行哪些用例或多长时间,以实现性价比高的测试,从而提升效能。
经过一年多的研究、开发和实验,百度智能测试团队借助强大的质效中台提供标准化、规模化的数据+风险模型研究,在百度系的众多业务线得到试点和落地,现总结成系列文章(主要解决1和2两个问题,质量度模型与自动化测试任务的解决将在智能构建系列文章呈现),推送给同行,希望能够一起交流和探讨。
具体系列文章如下:
*系列文章可能因为具体项目推进情况会发生调整或合并
质量度模型系列一---测试智能分级与风险评估在商业平台的应用探索
质量度模型系列二---质效中台助力实现质量度模型规模化落地
质量度模型系列三---风险预估算法调研与应用实践
质量度模型系列四---质量度模型特征挖掘方案
质量度模型系列五---基于质量度模型的风险决策实现交付过程无人值守
一、背景介绍
二、解决思路
三、技术方案
1. 研发流程规范
2. 项目特征选取与获取
2.1 项目特征选取
项目需求画像
项目开发画像
项目测试画像
用例准入执行数量、持续集成结果、增量覆盖率、bug收敛曲线、项目千行代码bug率等,如自测或QA测试用例覆盖场景越多,持续集成通过,增量覆盖率越高,bug曲线收敛比较好,则项目质量风险越低。
2.2 极致全面的测试中台能力,助力基础特征数据获取
3.1 规则建模
3.2 基于数据的建模方法
3.2.1 常见分类算法
3.2.2 逻辑回归模型
的值表示预测结果取1的概率,若概率大于阈值则预测为1。一般选择0.5作为阈值,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。
在测试准出场景过程中,100%测试覆盖在常规的软件测试过程中一般是不可达的(即使100%的代码覆盖也不能保证没有bug),其时间成本也不允许,根据项目的变更风险,完成哪些测试类型,达到怎样的增量覆盖是一个相对安全测试质量呢,而逻辑回归模型刚可以动态调整测试类型,用例覆盖场景,增量覆盖率等正向特征预测一个最小的值,使模型对样本的决策结果从0变成1,从而动态给出测试准出的提升建议。比如在质量风险较低的项目,可以在一个较低的增量覆盖就可以准出,而质量风险较高的项目,需要较高的增量覆盖率,更多联调场景,第三方回归才可以准出。
3.2.3 评分卡模型
最后介绍文章开始提到的在软件交付过程中引入质量度模型出发点,“跨界”参考了金融风控领域信贷申请过程最常用的模型,申请评分卡模型(A卡)。它是指根据客户的各种属性和行为数据,利用一定的信用评分模型,对客户进行信用评分,据此决定是否给予授信以及授信的额度和利率,从而识别和减少在金融交易中存在的交易风险。
参考贷前申请评分卡,给出项目质量评价卡模型示意图如下:
项目质量评分=基准分+需求变更评分+代码变更评分+增量覆盖率评分, 若某个项目质量评分大于项目质量高的阈值得分,则认为项目无风险可以准出。反之,刚认为项目有风险,需要根据提示继续提升手工测试覆盖或与第三方联调,或回归自动化等等。
评分卡模型的开发流程如下图所示:
数据获取:如第二章节提到从公司工具链获取基础数据,并以项目维度聚合生成项目质量画像样本,包含2种来源,一是冷启动时历史数据挖掘,二是在模型在业务线落地时经过人工打分标准的数据。
EDA(探索性数据分析):这个环节主要是指每个维度数据的缺失、异常情况、平均值、中位数、最大值、最小值、分布情况等,以便制定合理的数据预处理方案。主要有直方图、箱形图等指标描述样本总体情况。
数据预处理:在对样本数据整体情况有整体了解后,需要对缺失值,异常值进行处理。比如新人的千行代码bug率,未按流程规范提交代码导致增量覆盖率数据未自动获取,这里可以根据样本之间的相似性填补缺失值,若样本近正态分布则采用平均值, 若样本偏态分布可以中位数填充。也可以根据变量之间的相关关系填补缺失值,可以采用随机森林法对缺失值进行补充。异常值进行处理,比如开发周期超过45天,或单项目代码变更量超过2万行(1.0项目除外)的样本,常规迭代升级可以从已有样本中结合人工经验确定一些明显与实际值不符的样本,可以直接进行删除处理。
LR模型开发:评分卡模型通过对变量进行分箱来实现变量的分段,分箱主要是对连续变量进行分段离散化;同时将多状态的离散变量进行合并,减少离散变量的状态数。常见的分箱方法有:
等频分箱:把自变量按从小到大的顺序排列,根据自变量的个数等分为k部分,每部分作为一个分箱。
等距分箱:把自变量按从小到大的顺序排列,将自变量的取值范围分为k个等距的区间,每个区间作为一个分箱。
聚类分箱:用k-means聚类法将自变量聚为k类,但在聚类过程中需要保证分箱的有序性。分箱之后我们便得到了一系列的离散变量,接着我们需要对变量进行编码,将离散变量转化为连续变量。
WOE编码是评分卡模型常用的编码方式。WOE 称为证据权重(weight of evidence),是一种有监督的编码方式,将预测类别的集中度的属性作为编码的数值。对于自变量第箱的WOE值为:
其中是第i箱中坏样本占所有坏样本,是第i箱中好样本占所有好样本比例,是第i箱中坏样本的数量,是所有坏样本数量,是第i箱中好样本的数量,是所有好样本数量。
特征分箱有效处理特征中的缺失值和异常值,数据和模型会更稳定,同时简化逻辑回归模型,降低模型过拟合的风险,提高模型的泛化能力。WOE编码操作可以提升模型的预测效果,将自变量规范到同一尺度上,便于分析变量与变量之间的相关性。
生成评分卡: 我们将某个项目有质量风险的概率设为p, 则无风险的概率为1-p, 可以计算无风险和有风险项目比率为:
则评分卡设定的分值刻度可以通过将分值表示为比率对数的线性表达式,即
A和B是常数,公式中的负号可以使得逾期概率越低,得分越高。通常情况下,这是分值的理想变动方向,即高分值代表低风险,低分值代表高风险。A和B的值可以通过将两个已知或假设的分值带入计算得到。通常情况下,需要设定两个假设:
某个特定的违约概率下的预期评分,即比率odds为时的分数为
该违约概率翻倍的评分(PDO)
则根据以上假设odds为2时的分数为, 解议程组可得:
在实际的应用中,我们会计算出每个变量的各分箱对应的分值。新样本产生时,对应到每个分箱的值,将这些值相加,最后加上初始基础分,得到最终的结果。
上面的公式中的变量是出现在最终模型的入模变量。由于所有的入模变量都进行了WOE编码,可以将这些自变量中的每一个都写成的形式:
3.2.4 评价指标与模型训练分析
使用分类器进行预测结果可以分为四类,得到一个二分类的混淆矩阵:
预测不存在风险 | 预测存在风险 | |
实际不存在风险 | True Positive(TP) | False Positive (FP) |
实际存在风险 | False Negative (FN) | True Negative (TN) |
基于以上分类,度量预测准确度的指标有:准确率(Precision)、召回率(Recall)、正确率(Accuracy)。
为了做实验对比,我们对KNN、朴素贝叶斯、SVM、LR、CART决策树做了些实验对比,以便更好的选择合理的模型。
模型训练数据基于从业务线收集到的结构化历史数据,需要通过自动化和人工标注相结合的方式剔除异常数据后,再进行训练组和测试组数据划分。使用sklearn作为训练工具,不同分类器在数据集上的分类效果如下:
方法名 | 准确率 | 召回率 | 正确率 | AUC值 |
KNN | 90.00% | 82.89% | 79.27% | 0.7686 |
朴素贝叶斯 | 82.16% | 100.00% | 82.90% | 0.9278 |
SVM | 97.52% | 77.63% | 80.83% | 0.9020 |
LR | 91.46% | 98.68% | 91.71% | 0.9437 |
CART决策树 | 94.12% | 94.74% | 91.19% | 0.9090 |
得到不同分类器在数据集的ROC曲线如下:
可以看出,在相同数据集上虽然准确率逻辑回归模型在召回效果上会更好,也更加符合QA基本价值导向,即在保证质量的前提下去提升效率,且单从模型性能评价指标AUC来看,在数据集上的性能逻辑回归也相对更好。
另外逻辑回归模型还有另外落地场景,项目的需求变更,代码复杂度,bug收敛曲线等类型的特征认为是负向特征,即这些特征值越大,项目风险越高,能准出的概率越低。为了达成准出需要尽可能的提升增量覆盖,用例签章,自动化结果等正向特征值“中和”负向特征,使模型判断可以准出概率达到阈值,从而实现准出动态预估的功能。即项目风险低,预估的测试活动要求低,项目风险高,预估测试活动要求就高。也符合人对项目风险的识别后的基本行动导向。
评分卡模型的实验数据因进行了分箱和WOE编码转换,在对一些特征缺失的样本预测鲁棒性更好,整体召回率有所提升,整体f1测度提升较好。但自动分箱不满足单调性诉求,分箱成本很高,而模型的效果受分箱的合理性影响较大,目前仍在优化中。
4. 实现落地--基于质量度模型的交付架构
1)可视化平台
作为交互层主有3个作用, 一是以项目维度聚合项目涉及的模块,代码,分支,cimmitid,bug,项目状态等基本信息,统一研发过程, 二是聚合所有测试能力,根据项目特点推荐不同的测试工具,三是构建增量项目的画像样本,与模型侧交互,并将模型打分结果呈现给最终用户。
2)工具链层
项目研发过程是托管在公司工具链平台,除了基本的需求,代码,流水线管理, 还有环境,用例,自动化平台,精准系统等测试能力都属于这一层。
3)基础数据获取
从工具链中获取项目基础数据信息,根据需要做简单的二次加工。
4)特征工程
对基础数据做缺失异常值处理,数据分箱,编码等操作。
5)模型训练评估及部署应用
模型在测试集上经常评估后发布到策略中台,可视化平台在收集模型需要项目特征后请求策略中台,获取打分结果和报告,在人工确认并标注后,将增量项目样本推送到数据中台,分迭代优化模型。
5. 业务效果
1)自主测试转化
商业平台是引入项目质量度模型的业务线,自主测试的占比已经从最初完全依赖人工评估25%, 通过模型客观判断提升至60%,而这一比例随着数据特征不断的补充,对项目质量风险刻画更加精准,以及模型和落地流程不断优化,仍有10%~20%的提升空间,在降低项目平均交付周期同时可以大幅提升项目交付吞吐量,从而提升交付效能。
2)召回能力提升
通过质量度在准出环节的风险拦截,在有针对性的测试补充过程中召回40+问题,在高效交付同时保证了测试质量。
四、总结
在交付效能提升的过程中,针对传统研发过程中测试分级和准出两个场景完全靠人工评估无法保证质量,经常导致漏测,漏评的痛点问题,通过收集需求,研发,测试,上线各个研发阶段数据对项目进行精准刻画,并引入项目质量度模型,为项目分级和准出提供客观的风险决策支撑,让项目质量风险可见。这里需要指出是质量度落地需要研发流程、环境搭建、测试中台能力高度统一并具备高稳定性,才能为模型提供精准的聚合数据支撑。