OpenCV在自动化测试中的一些应用

本贴最后更新于 3299 天前,其中的信息可能已经时移俗易

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库。OpenCV是用C/C++语言编写而成,可以运行在Unix/Windows/Mac等操作系统上。与此同时,OpenCV还提供了Python、Ruby、MATLAB等语言接口,OpenCV可以提供简单易用的计算机视觉框架,帮助开发人员更快捷地设计复杂的计算机视觉相关的应用程序。

在GUI自动化测试中,测试方经常会遇到一些问题导致测试中断,不同的测试工具遇到的情况也不一样。对于需要绑定UI源代码来进行模拟操作的测试工具来说,如果UI源代码被修改,即使是小的修改也可能导致虽然界面看起来没有什么变化,但是测试已经无法继续进行的情况,而且这种测试工具脚本的编写需要对该应用的UI源代码有一定的了解,脚本的复杂度也比较高。还有一种方法是录入用户对屏幕的操作来进行模拟测试,这样测试脚本会比较简单,但是应用的界面布局变换会直接导致基于坐标的位置抓取失败,一些窗口大小位置微调或者系统弹出对话框等都会导致测试的中断。对于手机应用测试来说,一个好的手机应用通常会跨越好几个平台,不同平台上的编程方式和UI都不一样,类似的问题会更加突出,很多时候需要依靠手工测试,通过识别截图来判断问题出在了哪里,同样的可以用机器进行对截图的识别,来代替人工进行测试。

目前的计算机视觉软件大概有以下三种:

1.研究代码(慢,不稳定,独立并与其他库不兼容)

2.耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)

3.依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)

OpenCV可以提供API简化计算机视觉程序和解决方案的开发同时通过优化的C代码的编写对执行速度带来了可观的提升。

 

 

图片1 OpenCV与其它视觉函数库性能对比

 

OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,通过使用OpenCV,对手机UI进行识别和定位可以比较容易的解决上述出现的问题,这种利用UI截图进行测试脚本的编写使得测试人员只需要具有基本的程序设计知识即可快速学会创建自动化脚本进行GUI测试。

OpenCV中,一种识别图片的方法是模板匹配,模板匹配可以实现在一幅图像中寻找与另一幅模板图像最匹配(相似)部分,通过模版匹配的方法可以定位需要测试的UI控件在界面上的坐标,通过模板匹配得出的坐标不是固定的,而是通过识别最相似的部分计算得出的。模板匹配的主要步骤一般是先通过截图界面,得到需要进行匹配的目标图片,然后以需要测试的UI界面为模板图片,在截取图片上覆盖同样大小的区域进行计算,得出模板和覆盖区域的匹配值,然后滑动模板图片进行下一个区域的计算,所有计算结果中的最大值就是最佳匹配值,OpenCV向用户提供了多种匹配算法。得到最佳匹配同时也会得到测试UI在当前截图的最佳匹配坐标,通过该坐标,可以进行对手机进行各种操作测试。模板匹配是比较基础的一种匹配方法,对模板的要求比较高,但是容许一定的失真。

对于GUI变化的复杂情况,使用基于样本的学习的方法将测试GUI可能的变化情况作为样本存储,然后确定相近特征的样本并获得相应的匹配值。用OpenCV来做特征提取匹配相当简便,只要检测每张图像的关键点,然后在目标图像中找到相应的图像即可,过程如下:

1、读取图像的 mat 数据

2、使用 detector 获取关键点

3、通过关键点,得到图像的描述信息

4、比较图像的描述信息,在目标图像中找到相应的图像

5、通过匹配后的数据,实现相应的功能(对应用进行操作)

在OpenCV中,实现了很多种特征,如SIFT,FAST等,这些特征的实现各不相同,但是都是从一个公共抽象基类派生出来的,因此可以用多态方便地切换特征提取算法。

在实际测试过程中,不同应用和应用的不同UI的情况变化很多,所以需要根据不同的需求和情况选择和优化不同的方法,但是核心都是对测试UI的图片识别。

这种利用目标GUI元素的截图来获取需要进行操作的对象,并执行相应操作的测试方法简单高效。使得GUI测试摆测试脱了对应用的内部程序实现的依赖,无需获取手机 API和了解 GUI 的内部代码实现,也不需要关注标准控件和非标准控件在操作和获取上的差异性,普遍适用于所有运行在有图形用户界面的操作系统之上的应用,有 GUI 显示的地方即可被获取和操作。可以最大限度的缩小与截图手工测试的差距。

在实际应用中,这种基于图片的测试方法也有一定的局限性,测试的结果需要依赖屏幕截图,而在不同的手机操作系统上,根据需求可能需会要独立维护一套图形源文件,对识别算法的要求也很高,对于其跨平台的能力造成障碍。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
请输入回帖内容 ...

推荐标签 标签

  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1444 引用 • 10083 回帖 • 508 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 680 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 71 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 496 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 6 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖
  • danl
    179 关注
  • V2Ray
    1 引用 • 15 回帖 • 5 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • abitmean

    有点意思就行了

    36 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 5 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖
  • AWS
    11 引用 • 28 回帖 • 6 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 313 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 3 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 239 关注
  • Outlook
    1 引用 • 5 回帖 • 3 关注
  • 印象笔记
    3 引用 • 16 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 253 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖 • 1 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 39 关注