作者|王洋背景自动化测试从最早的录音回放技术开始,逐渐发展到DOM对象识别和分层自动化,以及基于POM(PageObjectModel)改进用例复用,到现在火热的基于AI技术的自动化,体现了自动化测试的发展趋势是更智能、更准确、更高效。在这里我们介绍两种已经被业界广泛应用的智能自动化测试技术:自愈技术机器学习技术自愈技术1.什么是自愈技术自愈(Self-Healing)技术是指在计算机术语:一种自我修复的管理机制。与生命体类似,当生命体受到一些轻伤时,其身体往往可以在没有外界干预的情况下,通过自身的修复机制实现自我修复。比如壁虎的断尾再生,或者螃蟹的身体再生能力。回到计算机领域,自愈技术也被广泛应用,如芯片信息通道的自愈、软件系统的自愈等。所以我们这里要介绍的是一种自动化测试方向的自愈技术:它可以在其测试脚本的执行过程中发现意想不到的错误,并在没有人为干预的情况下改变自己,从而使自己恢复到更好的状态经营状况。2.原理介绍问题域:在自动化测试中使用自愈技术,主要解决对象识别问题。传统的自动化测试框架和工具使用应用程序模型来定义应用程序的组件和对象及其属性。然后使用这些定义来识别和操作应用程序组件。但是应用程序在更新时会经常更改。可能是有意的开发人员更改或即时发生(通过应用程序系统或构建过程)。这些变化破坏了我们基于静态定义的传统自动化方法。自然语言处理(NLP)和机器学习(ML)等智能技术已经发展到测试脚本现在可以“学习”和“适应”的程度;自愈式自动化测试工具利用AI和)或应用环境的变化,测试流程可以自动更新和调整。运行测试时,他们会扫描应用程序的用户界面以查看是否存在任何对象。然后,他们将这些对象与先前为自动测试生成的应用程序模型进行比较。有一种技术可以让测试在应用程序发生任何变化时自动适应和更新。这种能力被称为“自我修复”。属性变化是自动感知的,内部脚本在运行时通过自我修复进行自我修复。自愈功能具有以下两个显着特征:在执行过程中,如果某个测试步骤定位器无法通过其默认定位器值检测到,则列表中的其他定位器策略将自动应用,无需测试人员进行任何手动干预。执行将继续,就好像没有发生故障一样。在执行过程中,如果测试步骤定位器失败并且无法使用任何其他定位器策略自动检测到,测试将暂停执行,允许用户选择相关元素并继续执行。新的定位器策略会在下次执行时自动更新。下图介绍了自我修复技术的主要步骤:(来源:https://www.impactqa.com/blog/5-great-ways-to-achieve-complete-automation-with-ai-and-ml/)自动化测试自愈技术的优势主要包括:(1)降低测试失败率测试执行失败是正常的,但有时失败的根本原因只是因为用户界面发生了变化,测试脚本变了没有同步改变。使用自我修复技术,不太可能由于错误识别的对象位置而发生脚本执行失败。传统的自动化方法无法识别这些变化并自动更新。(2)提高测试稳定性如果我们的测试过程中出现了flaky测试,我们就很难判断我们的测试是否稳定。“NoSuchElementException”错误是导致测试设计不稳定的几种错误之一,测试团队很难完全控制此类现象的发生。而当我们的测试设计与应用保持一致时,测试在执行过程中失败的可能性更小,执行过程也更顺畅。(3)提高脚本的可维护性测试代码的变更与开发人员对应用程序所做的变更正相关。因为测试失败的原因可能多种多样,并不能反映AUT的真实状态;因此,失败的测试结果会限制测试人员获得有关其测试的有意义的见解。自我修复技术通过为用户界面中的任何更改识别和更新测试用例来节省敏捷测试和开发团队的时间和精力。除了时间和精力之外,测试自动化中的自我修复还显着降低了测试脚本的维护成本。3.业界实践我们可以看到,业界已经有一些好的实践,比如Healenium项目。以Healenium项目为例,看看自动化测试自愈技术是如何工作的:假设我们用id定位应用界面上的一个按钮,定位符应该是:#button从上图可以看出,元素可以正确定位。Healnium会将正确的定位器保存为下一次测试执行的基准值。现在,假设开发人员通过将按钮的id属性从#button更改为#green_button来更改应用程序的UI。但由于某种原因,测试团队没有得到这一变化的通知,所以测试脚本没有更新。那么当我们再次执行脚本时,当我们尝试使用#button的旧定位器来定位按钮时,脚本就会报错,提示“NoSuchElement”错误异常。在这种情况下,使用标准Selenium实现的测试将失败,但不使用Healenium。Healenium捕获NoSuchElement异常,触发机器学习算法,传递当前页面状态,获取以前成功的定位器路径,进行比较,并生成固定定位器列表。它采用得分最高的定位器并使用该定位器执行操作。正如我们所看到的,该元素已成功找到并通过了测试。测试运行后,Healenium会生成一份报告,其中包含有关修复定位器、屏幕截图和修复成功反馈按钮的所有详细信息。如果修复成功,我们可以使用HealeniumIdea插件更新我们的自动化测试代码:该插件使用修复定位器找到修复并更新测试代码。Healenium使用机器学习算法来分析当前网页的变化:基于权重的最长公共子序列算法。关于这个项目的更多细节,可以访问这个项目的官网:https://healenium.io/通过这个案例,我们来比较一下传统自动化测试方法中对象维护和基于self的自动化测试方法的区别-治愈技术(如下图所示):2.机器学习识别问题。但是在自动化测试的过程中,我们还面临着其他的问题:仍然需要手动获取定位方法;如果是通过Canvas绘制的对象,如何识别元素(如FlutterWeb)。等等。自我修复技术为传统的自动化测试增加了一些容错能力。但本质上还是一种基于元素定位的对象识别技术,使用的是传统的DOM定位技术,比如XPath或者CSSlocator。而我们知道,移动端和网页端的运行环境复杂,外界的干扰因素很容易破坏自动化脚本运行的稳定性,这是元素定位器本身的脆弱性造成的。因此,业界一直在不断探索更稳定的物体识别技术。早期我们采用CV(ComputerVision)计算机视觉+OCR(OpticalCharacterRecognition)光学字符识别技术。CV和OCR基于图像处理和统计机器学习方法。比如业界流行的自动化测试框架airtest,就是基于CV技术进行智能控制识别。通过OCR和图像识别能力,在同一个流程下,可以在多个平台上执行一套自动化脚本,大大降低脚本编写和后期维护成本。目前业界也在实践和探索基于机器学习技术的CV和OCR,以解决学习成本高、维护成本高、Hybird识别差、跨应用能力差、不支持跨平台等问题。自动化测试。1、智能识别在UI页面中,我们的信息主要由图片和文字组成。如何基于图像和文本高效识别控制对象是当前自动化测试不得不面对的问题。为了解决基于DOM技术的元素定位不稳定性和后期维护成本。目前,UI控件的识别有两种方法:一种是基于CV技术的图像识别,另一种是基于OCR技术的文字识别。(1)基于CV的图像识别传统CV传统的方式,我们主要是基于图像特征识别技术:提到图像识别算法一定不能绕过OpenCV。常用的是SIFT算法,核心是提取图像。这些特性中的一些关键特性在不同机型、不同分辨率下都有很好的适应性。基于传统特征识别技术的处理过程如下图所示:b.基于深度学习的CV比现在的定位策略(image)更加灵活,因为我们可以使用CNN或者其他深度学习框架训练AI模型来识别控制图标不需要知道上下文,也不需要匹配控件图标完全一样。也就是说,我们或许可以跨应用跨平台找到“购物车”图标这样的控件,而不用关心一些细微的差异。基于深度学习的处理流程如下图所示:虽然基于深度学习的CV具有更强的能力,但传统方法仍然具有不可替代的优势,值得继续学习。比如从目前来看,深度学习仍然需要大量的数据,传统的方法在这方面会节省很多成本。对于一些比较简单的识别任务,我们推荐传统的CV方法。(2)基于OCR的文本识别OCR可以识别屏幕上预定义的字符。使用OCR的软件将采用“最佳猜测”来确定图像是否与字符匹配,以便将该图像转换为计算机可以处理的文本。传统的OCR基于图像处理(二值化、连通域分析、投影分析等)和统计机器学习(Adaboost、SVM)。传统的OCR只能处理比较简单的场景,比如:页面布局简单,前景和背景信息容易区分,每个文本字符容易分割。随着我们的测试对象越来越复杂,传统OCR的准确性在页面布局、样式等多种场景下也受到挑战。随着深度学习的发展,我们可以通过新的算法技术来解决传统OCR的局限性。2.案例实践业界大多基于AI的自动化测试平台采用智能识别技术结合CV+OCR来降低自动化测试脚本的编写成本和后期维护成本。下面以基于OpenCV的airtest平台为例:基于OpenCV的UI自动化——AirtestAirtest主要使用两种传统的OpenCV匹配算法:模板匹配和特征匹配。模板匹配:跨分辨率识别必须有相对最好的匹配结果方法名:"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等深度学习技术来解决此类问题。这里就不展开太多了,大家可以参考AppiumwithAI这个项目。详情:https://appiumpro.com/editions/39-early-stage-ai-for-appium-test-automation3。未来展望随着DL、RL、NLP等技术的不断发展,我们是否有可能将用户故事自动转化为自动化测试用例,实现真正的零代码。目前业内有这样的探索,我们正在持续跟进。CV和AI算法的加持,让UI自动化测试在物体识别上有了新的突破,但仍无法摆脱软件层API操作的局限。由于操作系统的限制,在某些特定场景下(如系统中的Push消息操作)还存在无法识别元素的问题。我们可以看到,行业内的龙头企业正在尝试用自动机械臂来解决这个问题。阿里的Robot-XT如下图:(图片来源:https://mp.weixin.qq.com/s/5ZngQyJiRZy6714-CC498g)那么这些技术是大厂的“专利”吗?我认为答案是否定的,未来人工智能技术一定会像水、电、煤一样成为最基础的基础设施。我们只需要知道如何使用它。3.总结在本文中,我们介绍了两种被广泛使用的自动化测试新技术。目的是帮助大家了解自动化测试未来的发展趋势,从而更好的利用新技术来提高我们的测试效率。未来自动化测试的趋势不止这两个,还有智能探索测试、智能遍历测试、智能验证。
