背景
自动化测试技术从最初的模拟硬件方式,到基于数据驱动,基于关键字驱动,再到现在基于功能和指令驱动的自动化测试技术,在各类软件项目中的应用也越来越多,越来越成熟。自动化测试技术有良好的可重复性,高并发和高效率的特点,为各类测试项目中显著的提高了测试效率,将测试人员从繁琐的执行中解放了出来;但是在实施自动化测试过程中,往往测试准备,测试复测,结果分析和案例维护等方面需要耗费大量的时间和资源。
随着人工智能的普及,期望在自动化测试的过程中还需大量投入人力的环节进行优化和重构;终极的目的是使得自动化测试能够尽可能脱离人工,实现真正意义上的自动化。
项目目标:
形成一套智能的自动化测试解决方案,能实现各种移动app的全自动bug探索测试工作。
1、通过一套自动测试框架/脚本实现任意APP的全路径bug探索测试工作。
2、实现对APP功能模块的自动探索,形成功能导图。
3、实现失败案例自动分析和复测,测试结果的智能化分析。
4、实现执行过程的可视化,使得定位问题更加清晰准确。
可行性分析
一.智能识别被测对象
1.通过android工具的LazyUIAutoMatorViewer可以自动获取控件对象信息。
2.根据控件的特征,通过人工智能提取特征训练进行业务功能的识别。
二.根据被测对象特征,智能化的开展测试
1.对移动应用测试的操作方法进行归类和封装(参见 4、控件对象的操作封装)。
2.根据不同的业务功能,形成特定的测试脚本。
3.根据被测应用的对象和业务情况,智能化的开展测试执行。
三.智能分析测试结果,针对性补测
1.根据错误的特征,通过人工智能识别并分类。
2.通过分析形成的业务功能导图,针对失败的节点结合错误特征开展补测。
环境信息
测试APP:某手机银行APP、微信APP
测试平台:Android+Appium
人工智能工具:Sklearn,ANN
脚本语言:Python3.6
人工智能自动化探索流程:
流程概述:获取应用信息->生成操作代码->执行测试操作->完成探索测试->生成应用逻辑导图->被测对象分类->匹配测试脚本->执行测试->生成测试报告
项目详述:
1、应用逻辑导图
首先测试执行之前,我们需要探索形成被测应用的结构,功能和控件对象类型的集合,生成应用的应用逻辑导图。
通过大量给应用逻辑导图对应界面图加功能名标签,训练逻辑导图知晓相关界面的功能名,最后可通过人工智能识别,自动生成准确的逻辑导图。
通过逻辑导图一是可以给测试执行提供操作步骤和执行顺序;二是可以在出现问题时记录分析和自动补测。
应用界面探索:
由于逻辑导图需对被测应用进行探索,探索中会不断出现新的未测试过界面,但也会出现已经测试完的界面,为了不重复探索,需要识别界面是否为新界面,而界面中不乏有会自动变化的控件,比如轮播图,或定时刷新显示的数据
这块可以通过人工智能识别图像判断是否是新的界面,方法如下:
测试对象为进入界面的截图,对比对象为此前所有界面截图的数据集
使用ORB检测器,BFMatcher提取并计算特征点,KNN筛选结果,计算出对比图片的相似度
主要代码如下:
读取图片
img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)
初始化ORB检测器
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
提取并计算特征点
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
knn筛选结果
matches = bf.knnMatch(des1, trainDescriptors=des2, k=2)
查看最大匹配点数目
good = [m for (m, n) in matches if m.distance < 0.75 * n.distance]
similary = len(good) / len(matches)
经验证,目前参数设置相似度达到65%以上既为同一界面比较合适。但该算法也会出现极个别界面相似度异常(比如下面两个画面会被算法识别为新的界面,即低于65%),还需要完善算法或使用更好的算法。
为了保证准确性,添加使用了图像像素遍历比较的方法,并把相似度定为98%。
把未通过KNN算法相似度低于65%但像素比对高于98%的界面,认为是已测试过的界面。
2、智能识别业务功能
2.1 OCR文字识别
通过OCR图片文字识别技术可以识别业务关键字,如储蓄,存款,存单,定期,纪念日,专享,利率等。并对每个界面的关键词组建立相关数据,构建界面关键词库,锚定界面业务功能。
2.2图像特征识别
针对图标,图片等对象,也可以通过卷积神经算法得出对象特征,计算对象所属业务功能和业务层级关系。在界面中存在文字相同的对象的情况下,可以起到很好的识别区分效果。
2.3功能界面分类
通过之前提到的控件识别及界面标题识别,结合具体的功能界面,可以推测出功能界面信息。
如下图,左图将识别为入口类界面;中图将识别为具体功能界面;
右图这种在标题位置有明显标识的类型,将被识别为具体功能界面,并将把标题权重提高,作为主要功能关键词。
3、应用控件对象识别。
应用中的每个界面都有很多控件,并且控件的类型多种多样。我们需要能智能的识别出控件的类型,路径等信息
比如下左图是某银行APP首页;下右图为控件对应的XML信息。
通常人工编写脚本的过程是手动找到控件的XML信息,编写Appium可识别的对象,然后加上Appium的操作代码,完成对对象的操作指令,如下图:
上图红框中,find_element_by_name,find_element_by_xpath都是找对象的不同方法,括号中的参数是对应的数值,一般需要人工确认才能找到对象,而find_element_by_xpath是最通用的方法,其对应的参数就是Xpath。
click()方法是最多使用的对象操作指令,可以完成多数的页面跳转。
所以要机器完成appium脚本创作,只需要自动找出对象和加上对应的操作指令即可。
通过学习研究,我们总结出一些Xpath的规律,一般可以有以下几个元素构成:
一:text或content-desc(例如:财富)
二:resource-id(例如:cn.com.spdb.mobilebank.per:id/close_dialog)
三:instance(例如:0)
四:class(例如:android.widget.RadioButton)
通过组合后一般可以得到以下的Xpath
//android.widget.RadioButton[@resource-id=‘cn.com.spdb.mobilebank.per:id/radio_button1’]
//android.widget.TextView[@text=‘转账汇款’]
//android.widget.LinearLayout[@resource-id=‘cn.com.spdb.mobilebank.per:id/ll_item_adver_layout’]/android.widget.ImageView[1]
APP的控件类型非常多,并且还有很多自定义控件(布局控件),还有一些兼容用的视图,而对控件的操作主要是点击,输入和清空只用在文本控件的操作上。
可以参考下面的列表,包含了常用的一些控件类型:
4、控件对象的操作封装
安卓基础控件库
这里我列举一些,更多的大家可以查看我之前的一篇帖子。
https://blog.csdn.net/ccq_lyc/article/details/89245315
基础控件库名 | 控件库作用 | 详细说明 |
---|---|---|
AndroidAppStart | 启动App | 启动应用的某个界面(比如首页) |
AndroidClick | 点击控件 | 点击控件 |
AndroidEdit | 编辑文本 | 密码,特定格式文本,字体,输入框有无焦点 |
AndroidTap | 点击坐标 | 点击坐标 |
AndroidSwipe | 滑动 | 方向滑动,滑动触发行为,特定滑动控件 |
另外移动应用中存在着多页的页面,需要上下滑,或左右滑,才能完整显示,所有需要添加翻页的功能,并且要考虑到不同分辨率的情况。
以下是对应的滑动代码。
5、测试结果智能分析
1、错误分类识别和处理
测试中难免出现报错,手工排查效率很低,特别是在大量测试后,人工排查也将费时费力,如果自动识别测试错误类型,并针对性的自助处理,测试效率将大大提高。
主要有程序错误,数据错误,环境错误三大类,处理逻辑请看下图:
2、业务变更自动识别
在功能逻辑导图形成的前提下,智能对比变更前后的应用差异,快速告知测试人员业务功能变更情况;可以有效降低变更关联性风险,提高变更分析效率。
利用之前提到生成的应用逻辑导图做了一些功能扩展,在自动化执行开始后,根据验证情况,添加错误(红色)或提示(黄色)警告,帮助测试人员了解错误信息,并通过点击警告,了解详情。
例如下图,如果品牌特惠出现测试错误,基金存在新的基金上线,理财产品短期理财理财信息变更,理财产品专属理财数据错误。
示意图:
点击短期理财警告图标,将打开短期理财测试记录文件夹,查看提示信息
限于篇幅,很多地方未能介绍详细;同时也受限于精力,还有很多带实现优化的地方。后续笔者会继续更新,补全整篇。也欢迎广大的朋友们群策群力,共同完善。