测试中如何运用图像识别技术
提起ui自动化大家首先想到的就是基于控件的自动化,比如常见的xpath、id、css选择器等手段进行元素定位并进行结果判断。但是在实际应用中,无论是web端还是移动端,仍有很多时候需要根据页面内容、页面中的图像进行定位及判定,是这些手段所达不到的,这里我们来介绍一下关于图像识别在测试中的应用。
在具体讲解之前,先介绍一下图像识别在测试中能够想到的引用场景:
-
测试过程中,通过对待测软件进行屏幕截图,采用图像识别算法识别截图中是否包含预定义的可操作控件,如果存在,则触发控制指令,也就达到了图像识别引导测试过程的目的。- 测试结果的验证,通过对待测软件的界面进行截图操作,利用图像识别技术将截图与期望的结果进行匹配,从而自动获取测试结果。- 通过图像识别对比来进行性能测试,比如app测试中常见的响应时间的测试。 一、原理
Sikuli脚本是由jython通过图像识别的方式来模拟键盘和鼠标事件,从而实现ui层面的自动化测试。Sikuli脚本的核心是一个java库 ,主要由两部分组成(见上图): java.awt.Robot部分主要是将键盘和鼠标事件传送给指定的位置,具体的位置是由c++引擎(基于opencv模块)通过脚本中的目标图片去屏幕上搜索并定位。C++引擎与java的JNI链接并且进行编译来适应不同的平台。在java的上层则是一个简单的应用层,主要用于开发自动化脚本,这层给最终用户提供了一套简单易用的命令。
二、函数介绍
1.find(x)
在屏幕上找到相对应的图片,比如选定一个手机。
示例代码:
2.findall(x)
在屏幕上找到所有的相同图片x,比如可以关注多个手机(一次性把所有的图片的坐标选定,如果选定后再刷新桌面背景有可能出现之前的坐标和之前的功能点对应不上,达不到测试效果)。
示例代码:
3.wait(x,10)
等待图片x在屏幕上或者指定的区域中出现,超时时间设为10秒。
示例代码:
4.waitVanish(x,10)
等待屏幕上或者指定区域中给定的gui组件消失,最长等待10秒(最好设置时间)。
示例代码:
5.exists(x)
在屏幕上或者指定区域中查找指定的GUI组件是否存在,若找不到该组件,就返回none,不抛异常,同时可以设置超时时间。
示例代码:
6.click(x)
在屏幕上或指定区域中左键单击匹配度最佳的GUI组件。
示例代码
7.dubleclick(x)
在屏幕上或指定区域中双击匹配度最佳的GUI组件。
示例代码:
8.rightclick()
在屏幕上或指定区域中右击匹配度最佳的GUI组件。
示例代码:
9.hover(x)
将鼠标指针移动到匹配度最佳的GUI组件。
示例代码:
10.dragDrop(x,y)
将图片x拖拽到图片y上。
示例代码:
11.type(x,“text”)
给选定的焦点输入内容。
示例代码:
12.paste(x,“text”)
给选定的焦点粘贴内容。
示例代码:
三、代码介绍
下方图片是一个具体的demo,代码介绍则可参考:
www.sikuli.org/productivit…
四、优缺点
优点:
介绍到这里会有人问,有了webdriver等ui自动化后为什么还要用图像识别呢?我认为主要有以下这几点:
1、代码简单易懂,简单到什么程度呢?可以说会截图就可以进行自动化测试。
2、一些游戏或者一些特殊应用的ui控件比较难以识别,然而通过图像识别却可以轻易找到对应的元素。
3、代码的学习成本比较低,常用的函数已经封装完毕,并且简单易懂。
4、工具开源可以进行二次开发,扩展性更好。
5、可以识别类似flash这样不能通过识别控件来进行自动化测试的项目。
缺点:
1、屏幕不能有遮挡,因为sikuli需要在当前桌面识别对应的目标并进行操作,如果桌面有遮挡就会导致对应的元素找不到。
2、如果代码换一个显示屏进行测试就要重新进行截图,因为之前所有的截图分辨率已经不适应当前界面。
3、不能在后台进行测试,必须前台运行。
Q
是WEB平台部测试技术平台化、效率化的先锋力量!
本文转载自 360质量效能
上一篇: 使用Java和SikuliX进行基于图片的自动化测试实践
下一篇: SikuliX 2.05
推荐阅读
-
IDC与蚂蚁金服集团联合发布《风控技术十大趋势白皮书》--这是风控行业技术创新的风向标,也意味着在与黑灰产品的交锋中,技术升级迫在眉睫。 今天的商业模式不同于以往,随着数字化进程的进一步加快,金融机构必须时刻准备应对可能出现的经营风险。面对无边界、强对抗的新型重大风险,金融机构如何与之博弈,并始终领先一步?这正是《IDC 风险控制技术十大趋势指南》将深入探讨的话题。我们摘录了白皮书的部分内容与您分享。要获取全文,请在后台回复 "风险控制趋势"。 1 数字支付激增
-
实践中的软件测试技术:设计、工具和管理 - 第 2 章第 2.3 节 使用状态转换图设计测试用例
-
如何评估软件测试中的质量风险?记住以下 5 个核心要点
-
如何在 Go 语言开发中执行单元测试和集成测试
-
如何使用 Java 中的自动化测试工具实施持续集成和自动化测试?
-
如何在 PHP 中实施单元测试
-
在单元测试中如何正确的处理第三方依赖
-
如何在技术团队中实施 OKR - OKR 的实施
-
像首席技术官一样思考:如何高效管理 30 人的研发团队?-管理越多越轻松。好的研发团队,应该是上拨下用,即下级对上级的向上管理;而不是反过来,总是向下管理,甚至是 CTO 做经理的事,经理做工程师的事,工程师最终会被当成实习生。如果是这样,就会越管越累,不仅团队无法成长,而且团队整天很忙还效率低下,问题一大堆。 有这样一个小故事:一位高级经理下班后帮忙倒垃圾,结果被老板训斥了一顿。这就好比首席技术官做了实习生自己该做的事。事情本身没有对错之分,只是从不同的角度有不同的理解。 古人云:"用人不疑,疑人不用"。在面对自己的研发团队时,应该相信他们能做好,授权一线开发人员充分发挥专业特长,不要限制他们的工作。但在相信他们的同时,也要进行二次确认,始终秉持 "我相信,但我要确认 "的原则和严谨的精神。因为每个人都会犯错和疏忽,通过发挥团队的智慧,团队犯错的机会就会大大减少。比如回归测试、代码审查、开发演示、变更审批等等。 如前所述,每个人都难免会犯错。但作为管理者,你所设计和商定的流程不能出错。管理者的每一个决定和沟通都应该经过深思熟虑。就像红绿灯的交通设计,某辆车不小心闯红灯可能会扣分,但红绿灯的设计一定要正确、人性化、统一。再比如,开发人员可能会因为疏忽大意写出 bug,但研发流程的设计和上线流程的发布不能有任何差错。因此,流程体系的设计,一方面要结合当前团队规模、业务特点和需要重点解决的问题来设计,另一方面也要在人员防错、效率提升、发挥团队集体智慧等维度进行综合考量。应该站在更高更抽象的角度去思考,不断思考一个倍受欢迎的园区应该如何设计,思考一个灵动、经典、永恒的建筑应该遵循怎样的模式,思考一个成功、优秀、卓越的研发团队应该需要怎样的流程和制度。 最后,反馈很重要。向上汇报很重要,向下反馈也很重要。能够保持顺畅的双向反馈和闭环管理,对研发团队的协作和沟通有着非常明显的积极作用。在向上汇报方面,要培养团队在正式汇报、会议汇报、私下沟通、书面总结、非正式场合等方面的沟通能力,提醒下属报喜也要报忧。凡事先记录,再跟进,最后反馈。反馈很重要,主动汇报更难得。 另一方面,同时也不要忽视向下反馈。好的爱,是双向的。团队也是如此,没有严格的上下级之分,只是分工和角色不同而已。作为管理者,不必总保持一种 "神秘感",让人 "捉摸不透 "才是牛。当团队做得好或有人做得好时,要记得在公开或私下场合给予肯定和赞许。业务有增长、业绩有提升时,别忘了给团队一些鼓励,或者安排一次下午茶或聚餐。在例会或正式会议上,也可以同步向大家传达一些重要信息和高层指示。"欲速则不达,欲远则同行"。 当向上汇报、向下反馈的沟通闭环形成后,同时结合前面研发过程的管理闭环,双管齐下,就能形成良性循环。如此反复,持之以恒,优秀卓越的研发团队,必将呈现。 能力、产出和效率 接下来,继续重复关于能力、产出和效率的话题。 站在不同的角色,以及一个企业经营、生存和发展所需要的基础上,我把研发生产力分为三个层次,分别是:一线员工关心的研发能力、管理层关心的软件产出和操作人员关心的企业生产效率。简单概括就是:既要把工作做好,又要能出成果,还要能帮企业赚钱。
-
如何在 Vue 技术开发中实现分页功能