本文可能跟大家普遍认知的机器学习的应用思路有些差异,公认的机器学习的步骤是:数据的探索分析 -> 数据转换和清洗 -> 特征工程选择 -> 特征工程提取 -> 模型训练 -> 调参 -> 应用。本文的思路则是在ML能力没那么强,但对业务比较熟悉的情况下,怎么快速利用机器学习的原理实现回归测试结果的抽样问题,比较适合新手。
本文主要介绍一个利用神经网络原理在导航系统中进行回归测试的具体用例,读者将get到的是:一,机器学习没有那么难,可以从很简单的思路入手;二,换个文本处理的思路。
一 问题的提出
如果你是一个需要做回归测试的QA,当面对需要测试的case有好几千条,并且每条case的检查点都有上百个,你会如何将回归测试的结果进行比对?比如下面的例子:
![e26f79062268ed5875cb2c79f3295e61.png](https://i-blog.csdnimg.cn/blog_migrate/7ddd07dafd3c3641f965d1e90b555a6e.jpeg)
二 模型产生的原因
如果是你,你从哪方面着手呢?我相信大多数人会想到NLP,先将文本信息用NLP特征化,然后提取特征,再选择模型进行训练,等等。
我的实现思路是利用神经网络原理(不是已有的库)+ 业务知识对得到的不同按照特征进行分类,然后从分类结果中根据测试的时间,选择需要检查的case进行手动检验(对于导航来说,自动验证结果是很困难的一件事)。
三 具体实现思路
- 抽取不同
利用工具将两次回归测试的不同找出来,我们当时用的是diff.exe(类似BeyondCompare的功能),结果如下:
![e26f79062268ed5875cb2c79f3295e61.png](https://i-blog.csdnimg.cn/blog_migrate/7ddd07dafd3c3641f965d1e90b555a6e.jpeg)
2. 利用神经网络原理实现模型
针对这个结果,估计好多人就一头雾水了。下面我介绍下我的思路:
我们的产品是导航产品,其核心算法是静态路网中求解最优路径的启发式算法,最优的含义是路径最优和性能的一种平衡,所以我们当时的测试思想是对核心算法模型的不断优化过程,而不是遵循传统测试的对与错。
对于我们的业务来说,可以将测试结果按照业务来分类,将其作为最后模型的分类结果,每个特征会有很多不同的逻辑,这部分可以根据最后的cost实现。如果是分类,那就会想到用监督学习中的分类方法实现,由于本人当时机器学习的知识有限,只是因为大学时学了神经网络和遗传算法等几个算法,预感用神经网络可行性比较高(有时知识少也许是个优势,因为没有其他选择的时候,就会顺着一条路深入走下去),于是就用神经网络实现了回归测试的case的抽样问题。
3. 模型的代码实现
人工神经网络ANN (Artificial Neural Network) 主要类型有: 前向神经网络、反馈神经网络、自组织网络和相互结合型网络等。为了实现的简单易调优,我们采用了采用三层前向神经网络(即含一个隐含层)。因为前馈神经网络简单,不需要误差函数,而且调整误差函数比调整权重要慢得多。
那么怎么用代码来实现神经网络的模型呢?
首先确定四个因素:输入、输出、输入层到隐含层的权重和隐含层到输出层的权重。
输入:回归测试比对的不同
输出:分类结果和每个case的cost
输入层到隐含层的权重:每类的权重
隐含层到输出层的权重:每类中的影响因子(神经元)的权重
其次代码设计思路:
根据业务反推,比如从A变成B,或者从ABC变成CDF,可能是哪种情况出现的,是哪个特征变化影响的,应该分到哪类里,这部分我们将用代码实现,所以需要对业务知识很熟悉,这部分对用户来说不透明,也就是神经网络的代码实现。
4. 权重的设计
输入层到隐含层的权重Wih:当时思考了几天,最后用二分法将特征按重要程度分类,Fx代表特征的种类,即最后的分类。
![0b64417cb100d54021a90a1ab6066a87.png](https://i-blog.csdnimg.cn/blog_migrate/f1341ba97a47fb31fcfd458a8ff666ff.png)
隐含层到输出层的权重Who:就是每个特征的变化不止一处,而且每处都关联多个因素,根据开发代码把影响每个因素变化的因素找出来,然后把这些因素根据观察回归测试结果和业务知识设置权重并进行归一化。
5. 计算从输入层到输出层的cost,并根据结果进行分类。
6. 用聚类分析方法根据最终的cost大小抽取指定数量的case。因为我们当时有sprint的压力,所以指定的数量是根据Sprint的时间适量抽取case检查。
7. 对回归测试结果进行人工标注,然后根据标注的期望结果和实际结果调整模型,这里需要注意的地方是,我们是同时调整神经网络模型和隐含层到输出层的权重来实现模型调优的。
注:因为分类明确切,且为了使模型简单,输入层到隐含层的权重没进行调整。
四 总结
- 如果没有足够的机器学习知识的情况下,可以换个角度考虑用机器学习+业务知识(或者跟领域专家配合)的方式去实现,所以对于业务知识比较强,而对机器学习新入门的人来说,可能是个不错的开始
- 以目标为导向,明确利用机器学习解决什么问题,尽量使用简单易用的模型,而不要考虑复杂的,因为机器学习的应用和学术是两个方向。
- 数学对于机器学习来说重要,但不同的应用场景下,对数学的要求不同,比如对于测试来说,机器学习对数学的要求没那么高,如本文采用的是简单的统计知识、二分法和归一化算法等,所以不要谈数学色变。
参考文章:
更详细的实现请参考:https://mp.weixin.qq.com/s/xJgqK3-NVOANVi5b0M6l9g
通过在ARGO中学到的ML的知识,后面还会思考怎么用机器学习的常规套路去设计回归测试结果的抽样问题。
请关注我们的公众号,ARGO团队后续将带来更多的优秀文章。
![5392003967dd9cd9aaa744a5d0abcf2a.png](https://i-blog.csdnimg.cn/blog_migrate/c10bd865423171135ec3e61d3bce5bed.jpeg)