图像识别在测试中的应用

2019 年 11 月 25 日

图像识别在测试中的应用

提起 ui 自动化大家首先想到的就是基于控件的自动化,比如常见的 xpath、id、css 选择器等手段进行元素定位并进行结果判断。但是在实际应用中,无论是 web 端还是移动端,仍有很多时候需要根据页面内容、页面中的图像进行定位及判定,是这些手段所达不到的,这里我们来介绍一下关于图像识别在测试中的应用。



在具体进行讲解之前先介绍一下图像识别在测试中能够想到的引用场景:


  • 测试过程中,通过对待测软件进行屏幕截图,采用图像识别算法识别截图中是否包含预定义的可操作控件,如果存在,则触发控制指令,达到了图像识别引导测试过程的目的;

  • 测试结果的验证,通过对待测软件的界面进行截图操作,利用图像识别技术将截图与期望的结果进行匹配,从而自动获取测试结果。

  • 通过图像识别对比来进行性能测试,比如app测试中常见的响应时间的测试


首先分享一下图形识别在自动化测试中的应用,目前比较流行的就是 sikuli, 其中关于 sikuli 的安装在这里就不多说了,官网有具体的介绍(https://launchpad.net/sikuli/+download)


原理



Sikuli 脚本是由 jython 通过图像识别的方式来模拟键盘和鼠标事件,从而实现 ui 层面的自动化测试。Sikuli 脚本的核心是一个 java 库主要由两部分组成:


java.awt.Robot 这个部分主要是讲键盘和鼠标事件传送给指定的位置,具体的位置是由 c++引擎(基于 opencv 模块)通过脚本中的目标图片去屏幕上搜索并定位。C++引擎与 java 的 JNI 链接并且进行编译来适应不同的平台。在 java 的上层是一个简单的应用层就是我们开发脚本用的,这层给最终用户提供了一套简单易用的命令。


函数介绍


Find(x)


在屏幕上找到相对于的图片,比如选定一个手机


示例代码:



findall(x)


在屏幕上找到所有的相同图片 x,比如可以关注多个手机(一次性把所有的图片的坐标选定,如果选定后再刷新桌面背景有可能出现之前的坐标和之前的功能点对应不上,达不到测试效果)


示例代码:



wait(x,10)


等待图片 x 在屏幕上或者指定的区域中出现,超时时间 10 秒


示例代码:



waitVanish(x,10)


等待屏幕上或者指定区域中给定的 gui 组件消失,最长等待 10 秒(最好设置时间)


示例代码:



exists(x)


在屏幕上或者指定区域中查找指定的 GUI 组件是否存在,若找不到改组件,就返回 none,不抛异常,同时可以设置超时时间


示例代码:



click(x)


在屏幕上或指定区域中左键单击匹配度最佳的 GUI 组件


示例代码:



dubleclick(x)


在屏幕上或指定区域中双击匹配度最佳的 GUI 组件


示例代码:



rightclick()


在屏幕上或指定区域中右击匹配度最佳的 GUI 组件


示例代码:



hover(x)


将鼠标指针移动到匹配度最佳的 GUI 组件


示例代码:



dragDrop(x,y)


将图片 x 拖拽到图片 y 上


示例代码:



type(x,“text”)


给选定的焦点输入内容


示例代码:



paste(x,“text”)


给选定的焦点粘贴内容(具体和 type 目前没发现具体的区别)



代码介绍


下面是一个用来测试响应时间的一个代码示例



优缺点


优点


介绍到这会有人问有了 webdriver 等 ui 自动化后为什么还要用图像识别呢?我能想出来的理由也只有这几点了:


1、代码简单易懂,简单到什么程度呢?可以说会截图就可以进行自动化测试;


2、针对一些游戏或者一些特殊的应用 ui 控件比较难以识别这样就可以通过图像识别轻易的找到对应的元素;


3、代码的学习成本比较低常用的函数已经封装完毕,而且简单易懂;


4、工具开源可以进行二次开发;


5、可以识别类似 flash 这样不能通过识别控件来进行自动化测试的项目;


缺点


1、 屏幕不能有遮挡,因为 sikuli 是在当前桌面识别 对应的目标并进行操作,如果桌面有遮挡就会导致对应的元素找不到;


2、 如果代码换一个显示屏进行测试就要重新进行截图,因为之前所有的截图分辨率已经不适应当前界面;


3、 不能在后台进行测试,必须前台运行;


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/IOjcS6MlOxruNY2sMKrnWA


2019 年 11 月 25 日 10:54302

评论

发布
暂无评论
发现更多内容

18 张图,一文了解 8 种常见的数据结构

沉默王二

Java 数据结构

技术译文|如何将 Pulsar 用作消息队列

Apache Pulsar

开源 云原生 pulsar Apache Pulsar 消息中间件

从全备中恢复单库或单表,小心有坑!

Simon

MySQL MySQL 运维

猛料!腾讯架构师手写“Java成长秘籍”,做开发也没那么难

互联网架构师小马

Java 编程 程序员 腾讯 软件开发

Java引入第三方包的路径问题

谷鱼

路径

分布式系统实践解读丨详解高内聚低耦合

华为云开发者社区

nginx 实现接口版本控制

lockdown56

php nginx laravel Nginx PHP-FPM 版本控制

腾讯架构师:亲手Debug之后,你就知道为何面试问源码了

小Q

Java tomcat 程序员 架构 调优

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

Java架构师迁哥

两天,我把分布式事务搞完了

yes的练级攻略

分布式事务 seata

anyRTC云端录制功能上线

anyRTC开发者

WebRTC 语音 直播 RTC 安卓

整合Elastic-Job(支持动态任务)

Nil

springboot SpringCloud 分布式任务调度 Elastic-job

关于Java调用类的main方法

谷鱼

Java 包位置

实战中学习浏览器工作原理 — 排版与渲染

三钻

CSS 前端 浏览器

年度开源盛会 ApacheCon 来临,Apache Pulsar 专场大咖齐聚

Apache Pulsar

开源 云原生 Apache Pulsar 消息中间件

环信和阿里云签署云原生合作,携手共建云通讯“新基建”

DT极客

新疆采风笔记:送行·出发·火车上

刘新吾

随笔 旅行 新疆

一个草根的日常杂碎(9月21日)

刘新吾

生活 现实纪录 随笔

2020年程序员必备的面试重点+面试真题+个人软实力,你学废了吗?

Java架构师迁哥

你一定看得懂的Netty客户端启动源码分析!

云流

Java 编程 Netty 架构师

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下!

Java架构师迁哥

华为云IoT智简联接,开启物联世界新纪元

华为云开发者社区

物联网

ECMAScript 6新特性简介

程序那些事

nodejs ES6 ECMAScript 6

智谱AI首席科学家唐杰团队荣获国际数据挖掘顶会时间检验应用科学奖

DT极客

揭示智能边缘重大机遇 英特尔邀产学研推动产业智能升级

intel001

海量数据拉升背后的成本困扰:存算分离成美图降本增效新良方

华为云开发者社区

大数据 华为云 海量数据

flutter 高效开发工具集

Daniel

高难度对话读书笔记—情绪篇

wo是一棵草

恶补,一文了解 8 种常见的数据结构

Java架构师迁哥

支付平台架构技术实现之终端安全

博文视点Broadview

架构 安全攻防 安全 支付系统 风控

Java 回调(Callback)接口学习使用

魏杰

图像识别在测试中的应用-InfoQ