1、背景
虽然自愈技术在传统的自动化测试中增加了一些容错能力。但是本质上还是基于元素定位的对象识别技术,用到的还是传统的DOM定位技术,如XPath或者是CSS定位器。
而移动端和Web端的运行环境复杂,外部干扰因素很容易破坏自动化脚本运行的稳定性,这是元素定位器脆性本质导致的。
所以业界也一直在持续探索更稳定的对象识别技术。在早期我们使用到了CV(Computer Vision)计算机视觉 +OCR(Optical Character Recognition)光学字符识别技术。而CV和OCR是基于图像处理和统计机器学习方法。
比如业内比较流行的自动化测试框架airtest,就是基于CV技术来进行智能控件识别的。
通过OCR及图像识别能力,实现相同流程下,一套自动化脚本可以在多平台上执行的能力,大大降低了脚本编写及后期维护成本。
目前业界也在实践与探索基于机器学习技术的CV和OCR来解决自动化测试学习成本高、维护成本高、Hybird识别差、跨应用能力差,以及不支持跨平台等方面的问题。
2、智能识别
在UI页面中,我们的信息主要由图像和文字构成。如何高效地识别基于图像和文字的控件对象,是当前自动化测试不得不面临的问题。为了解决之前基于DOM技术的元素定位不稳定,以及后期的维护成本。目前在UI控件识别上有两种方式:一个是基于CV技术的图像识别,一个是基于OCR技术的文字识别。
3、基于CV技术的图像识别
(1)传统的CV
在传统方式下,我们主要是基于图像特征识别技术。
提到图像识别算法一定绕不开OpenCV,常用的是SIFT算法,核心就是提取出图片当中的一些关键特征,这些特征在不同的机型,在不同的分辨率下面有很好的适应性。基于传统特征识别技术的处理过程如下图所示:
(2)基于深度学习的CV
这种方法比现行的定位策略(image)更灵活,因为我们可以用CNN,或者其他深度学习框架来训练AI模型去识别控件图标,并不需要知道上下文,也不需要精确匹配控件图标。也就是说我们可以能跨应用和平台去找一个如 “购物车” 的图标这样的控件,不需要在意一些细微的差别。基于深度学习的处理流程如下图所示:
尽管基于深度学习的CV具有更强的能力,但是传统的方式依然有不可替代的优势,值得我们继续学习。从目前来看深度学习仍然需要大量的数据,而传统的方式在这方面就会节省很大的成本。对于一些比较简单的识别任务,我们更推荐传统的CV方式。
4、基于OCR文字识别
OCR可识别屏幕上的预定义字符。使用OCR的软件将采用“最佳猜测”的方式来确定图像是否与字符匹配,以便将该图像转换为计算机可以处理的文本。传统的OCR基于图像处理(二值化、连通域分析、投影分析等)和统计机器学习(Adaboost、SVM)。
传统的OCR只能处理相对简单的场景,如:简单的页面布局、前景和背景信息便于区分及每个文本字符容易分割。随着我们的测试对象月来越复杂,页面布局,样式等多样化的场景下,传统OCR的精准度也收到了挑战。
随着深度学习的发展,我们可以通过新的算法技术来解决传统OCR的局限性。
5、业内实践
在业内,大部分基于AI的自动化测试平台均采用了CV+OCR结合的智能识别技术,来降低自动化测试脚本编写成本以及后期的维护成本。我们分别以基于OpenCV的airtest 平台为例:基于OpenCV的UI自动化 - AirtestAirtest主要用到了两种传统的OpenCV匹配算法:
(1)模版匹配算法
- 无法跨分辨率识别
- 一定有相对最佳的匹配结果
- 方法名:"tpl", "mstpl"
(2)特征匹配算法
- 无法跨分辨率识别
- 一定有相对最佳的匹配结果
- 方法名:"tpl", "mstpl"
在Airtest中可以自己配置选择使用的匹配算法。由于两种匹配算法各有利弊,因此一般默认是选择这几种匹配算法组合,算法依次进行图像识别,找到结果将停止识别,未找到结果将会一直按照这个算法的识别顺序一直循环识别直到超时。
Airtest里面有两个重要的名词:阀值和可信度,阀值是可以配置的,一般默认为0.7,可信度是算法执行结束后计算出来的可能性概率,当 可信度>阙值 的时候,程序会认为 找到了最佳的匹配结果 ;而当 可信度<阙值 的时候,程序则会认为 没有找到最佳的匹配结果 。
Airtest本身并没有直接提供OCR方式识别,不过我们可以通过集成开源的Tesseract-OCR库来支持OCR识别能力。
面临的挑战:基于传统的OpenCV的图像识别,主要的问题是图像的特征识别不够准确,特别是在图像本身的特征比较少,如有一大片白色背景等,或者是动态元素等。同时传统的识别成功率平均也就80%左右,还达不到人工的95%的准确率,因此在传统方式下,我们只能通过添加更多特征信息来优化识别率,但是想要匹配人工的准确率,传统的统计机器学习方式很难达到。解决这个问题就需要更强的泛化能力,目前更多的是基于CNN等深度学习技术来解决此类问题。Appium with AI项目参考:Appium Pro: Early-Stage AI for Appium Test Automation