自动化测试从最早期的录制回放技术开始逐步发展成DOM对象识别与分层自动化以及基于POMPage Object Model来提高用例复用到当前火热的基于AI技术的自动化体现了自动化测试的发展趋势是更加智能更加精准更加高效。在这里我们给大家介绍两种在业界已经有广泛使用的智能自动化测试技术自愈Self-Healing技术机器学习Machine Learning技术自愈技术1.1 什么是自愈技术自愈Self-Healing技术在计算机术语中是指一种自我修复的管理机制。类比生命体当生命体遭受到一些小的伤害时它们的身体往往能够通过自身的修复机制来实现自愈而不需要外界加以干预。如壁虎的断尾再生或者蟹类的躯体再生能力那样。回到计算机领域自愈技术也在广泛地使用比如芯片的信息通道自愈软件系统的故障自愈等。那么我们这里要介绍的是在自动化测试方向上的一种自愈技术可以发现其测试脚本执行中的非预期错误并在无需人工干预的情况下自行更改从而将自身恢复到更好的运行状态。1.2 原理介绍问题域在自动化测试中使用自愈技术主要解决的是对象识别object identification问题。传统的自动化测试框架和工具使用应用程序模型来定义应用程序的组件和对象及其属性。然后使用这些定义来识别和操作应用程序组件。但是应用程序在更新时会经常更改。可能是有意的开发人员变更或者是即时由应用程序系统或构建过程发生的。这些变化破坏了我们基于静态定义的传统自动化方式。自然语言处理NLP和机器学习 (ML) 等智能技术已经发展到测试脚本现在可以“学习”和“适应”的地步自愈式自动化测试工具使用 AI 和机器学习技术根据用户界面 (UI ) 或应用程序环境的变化可以自动更新和调整测试过程。在运行测试时它们会扫描应用程序的用户界面以查看是否存在任何对象。然后它们将这些对象与之前为自动化测试生成的应用程序模型进行比较。如果应用程序有任何更改则有一种技术可以让测试适应并自动更新。这种能力被称为“自我修复”。属性更改是自动感知的内部脚本在运行时通过自我修复进行自我修复。自愈功能具有以下两个显著特点在执行过程中如果某个测试步骤定位器无法被其默认定位器值检测到则列表中的其他定位器策略将自动应用无需测试人员的任何手动干预。执行将继续就好像没有发生任何故障一样。在执行过程中如果测试步骤定位器失败并且无法使用任何其他定位器策略自动检测到测试将暂停执行允许用户选择相关元素并继续执行。新的定位器策略将在下次执行时自动更新。下图介绍了自愈技术的主要步骤(图片来源https://www.impactqa.com/blog/5-great-ways-to-achieve-complete-automation-with-ai-and-ml/)自动化测试自愈技术的优势主要有减少测试失败率测试执行失败很正常但是有时候失败的根本原因仅仅是由于用户界 面发生了变化而测试脚本没有同步变化。使用自愈技术后由于无法正确识别的对象位置而影响脚本执行失败的情况就不太可能发生。而传统的自动化方式无法识别这些变化并自动更新。提升测试稳定性如果我们测试过程中有flaky tests存在的话我们很难确定我们的测试是否是稳定的。”NoSuchElementException“ 错误是导致测试设计不稳定的几个错误之一测试团队很难完全控制这样的现象发生。而当我们的测试设计和应用程序保持一致时测试在执行期间失败的可能性较小并且执行过程也更加顺畅。提高脚本维护性测试代码中的更改与开发人员在应用程序中所做的更改成正相关。由于测试失败的原因可能会发生变化并且不能反映 AUT 的真实状态因此失败的测试结果会限制测试人员获得有关其测试的有意义的见解。通过识别和更新用户界面中的任何更改的测试用例自愈技术节省了敏捷测试和开发团队的时间和精力。除了时间和精力之外测试自动化中的自我修复也显着降低了测试脚本维护成本。1.3 业内实践我们可以看到业内已经有一些比较好的实践了比如Healenium项目 。以Healenium项目为例看看自动化测试自愈技术是怎么工作的假设我们通过id 的方式来定位应用程序界面上的一个按钮定位器应该是#button从上图可以看到元素可以被正确定位到。Healnium会将正确的定位器保存下来作为下一次测试执行的基准值。现在我们假设开发人员变更了应用程序的UI界面改变了这个按钮的id属性从#button变更为#green_button。但是由于某种原因测试团队没有被通知到有这个变更所以测试脚本也没有更新。那么当我们再次执行脚本的时候在尝试使用#button的旧定位器去定位按钮的时候脚本就会报错提示 “NoSuchElement”的错误异常。在这种情况下使用标准的 Selenium 实现测试将失败但使用 Healenium 则不会。Healenium 捕获 NoSuchElement 异常触发机器学习算法传递当前页面状态获取之前成功的定位器路径比较它们并生成修复的定位器列表。它采用得分最高的定位器并使用该定位器执行操作。正如我们看到的元素被成功找到并通过了测试。测试运行后Healenium 生成报告其中包含有关修复定位器、屏幕截图和修复成功反馈按钮的所有详细信息。如果修复成功我们可以使用 Healenium Idea 插件更新我们的自动化测试代码插件使用修复定位器寻找修复和更新测试代码。Healenium 使用一种机器学习算法来分析当前网页的变化基于权重的最长公共子序列算法更多关于这个项目的详情可以访问这个项目官网https://healenium.io/通过这个案例我们来对比一下传统自动化测试方式和基于自愈技术的自动化测试方式中对象维护的差异如下图所示2. 机器学习在上一部分我们介绍了通过自愈技术解决自动化测试过程中对象识别问题。但是在自动化测试过程中我们仍然还会面临其他问题仍然需要人工获取定位方式如果是通过Canvas绘制出来的对象如何识别元素 (如Flutter Web)。等等。虽然自愈技术在传统的自动化测试中增加了一些容错能力。但是本质上还是基于元素定位的对象识别技术用到的还是传统的DOM定位技术如XPath或者是CSS定位器。而我们知道移动端和Web端的运行环境复杂外部干扰因素很容易破坏自动化脚本运行的稳定性这是元素定位器脆性本质导致的。所以业界也一直在持续探索更稳定的对象识别技术。在早期我们使用到了CVComputer Vision计算机视觉 OCROptical Character Recognition光学字符设别技术。而CV和OCR是基于图像处理和统计机器学习方法。比如业内比较流行的自动化测试框架airtest 就是基于CV技术来进行智能控件识别的。通过OCR及图像识别能力实现相同流程下一套自动化脚本可以在多平台上执行的能力大大降低了脚本编写及后期维护成本。目前业界也在实践与探索基于机器学习技术的CV和OCR来解决自动化测试学习成本高、维护成本高、Hybird识别差、跨应用能力差以及不支持跨平台等方面的问题。2.1 智能识别在UI页面中我们的信息主要由图像和文字构成。如何高效地识别基于图像和文字的控件对象是当前自动化测试不得不面临的问题。为了解决之前基于DOM技术的元素定位不稳定以及后期的维护成本。目前在UI控件识别上有两种方式一个是基于CV技术的图像识别一个是基于OCR技术的文字识别。2.1.1基于CV的图像识别传统的CV在传统方式下我们主要是基于图像特征识别技术提到图像识别算法一定绕不开OpenCV常用的是SIFT算法核心就是提取出图片当中的一些关键特征这些特征在不同的机型在不同的分辨率下面有很好的适应性。基于传统特征识别技术的处理过程如下图所示基于深度学习的CV这种方法比现行的定位策略 image 更灵活因为我们可以用CNN或者其他深度学习框架来训练 AI 模型去识别控件图标并不需要知道上下文也不需要精确匹配控件图标。也就是说我们可以能跨应用和平台去找一个如 “购物车” 的图标这样的控件不需要在意一些细微的差别。基于深度学习的处理流程如下图所示尽管基于深度学习 的CV具有更强的能力但是传统的方式依然有不可替代的优势值得我们继续学习。如从目前来看深度学习仍然需要大量的数据而传统的方式在这方面就会节省很大的成本。对于一些比较简单的识别任务我们更推荐传统的CV方式。2.1.2 基于OCR文字识别OCR可识别屏幕上的预定义字符。使用OCR的软件将采用“最佳猜测”的方式来确定图像是否与字符匹配以便将该图像转换为计算机可以处理的文本。传统的OCR基于图像处理二值化、连通域分析、投影分析等和统计机器学习Adaboost、SVM。传统的OCR只能处理相对简单的场景如简单的页面布局、前景和背景信息便于区分及每个文本字符容易分割。随着我们的测试对象月来越复杂页面布局样式等多样化的场景下传统OCR的精准度也收到了挑战。随着深度学习的发展我们可以通过新的算法技术来解决传统OCR的局限性。2.2 案例实践在业内大部分基于AI的自动化测试平台均采用了CVOCR结合的智能识别技术来降低自动化测试脚本编写成本以及后期的维护成本。我们分别以基于OpenCV的airtest 平台为例基于OpenCV的UI自动化 - AirtestAirtest主要用到了两种传统的OpenCV匹配算法1. 模版匹配 2 特征匹配两种匹配算法的特点如下模板匹配无法跨分辨率识别一定有相对最佳的匹配结果方法名tpl, mstpl特征点匹配跨分辨率识别不一定有匹配结果方法名列表[kaze, brisk, akaze, orb, sift, surf, brief]在Airtest中可以自己配置选择使用的匹配算法。由于两种匹配算法各有利弊因此一般默认是选择这几种匹配算法组合算法依次进行图像识别找到结果将停止识别未找到结果将会一直按照这个算法的识别顺序一直循环识别直到超时。如何判断图像识别成功或者失败呢Airtest里面有两个重要的名词阀值和可信度阀值是可以配置的一般默认为0.7可信度是算法执行结束后计算出来的可能性概率当可信度阙值的时候程序会认为找到了最佳的匹配结果而当可信度阙值的时候程序则会认为没有找到最佳的匹配结果。如下这个例子在Airtest中操作网易云音乐APP Touch(“图片”) 的原理如下Airtest本身并没有直接提供OCR方式识别不过我们可以通过集成开源的Tesseract-OCR库来支持OCR识别能力。面临的挑战基于传统的OpenCV的图像识别主要的问题是图像的特征识别不够准确特别是在图像本身的特征比较少如有一大片白色背景等或者是动态元素等。同时传统的识别成功率平均也就80%左右还达不到人工的95%的准确率因此在传统方式下我们只能通过添加更多特征信息来优化识别率但是想要匹配人工的准确率传统的统计机器学习方式很难达到。解决这个问题就需要更强的泛化能力目前更多的是基于CNN等深度学习技术来解决此类问题。我们这里就不过多展开大家可以参考Appium with AI项目。详情https://appiumpro.com/editions/39-early-stage-ai-for-appium-test-automation2.3 未来展望随着DLRL和NLP等技术的不断发展未来是不是完全可以将我们的用户故事自动转化为自动化测试用例做到了真正的零代码呢目前业内也有这样的探索了我们也在持续跟进。CV和AI算法的加持让UI自动化测试在对象识别上有了新的突破但依然无法摆脱软件层API操作的局限受所在操作系统限制依旧存在部分特定场景下元素无法识别的问题如系统内Push消息操作我们可以看到业内领先的公司在尝试自动机械臂方式来解决这个问题。如下图阿里的Robot-XT(图片出处https://mp.weixin.qq.com/s/5ZngQyJiRZy6714-CC498g)那么这些技术是否是大厂的“专利”呢? 我想答案是否定的未来AI技术一定也会像水电煤一样变成最基础的底层设施我们只需要会用即可。3. 总结在本文中我们介绍了两种应用比较广泛的自动化测试新技术目的是帮助大家了解自动化测试未来的发展趋势从而更好地利用新技术来提高我们的测试效率。自动化测试未来趋势不仅仅是这两种还有如智能化探索性测试智能遍历测试以及智能验证等。关于智能遍历所用到的技术大家可以参考DQN的介绍。最后下方这份完整的软件测试 视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】​​​软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。