UI 测试难题!自动化识别图片的正确率如何达到100%!

news/2024/4/26 23:04:22

摘要

在ui自动化测试领域,会遇到这样的情形:发布一张图片或上传一个头像,如何通过自动化测试的方式判定发布后的图片是否正确呢?又或者,我们如何通过自动化测试的方式判定某网页的某个logo是否与预期的一致呢?也许,你会想,要是能够自动比对图片,将差异化的点在图片上圈出来就好了。相信我,只要你想,就会有。

试想一下,上述情形,像不像我们常玩的“一起来找茬”呢?让我们以具体案例展示如何以自动化的方式“找茬”。

如下所示,图1、图2是我们两张相似图片(暂定图1名为img1,图2名为img2)。我们以图1、图2为例,使用自动化的方法找出两张图片中差异之处。

图片

图1. img1    

图片

图2. img2

方案设计

对于比较图片差异性,我们经常使用的是图片识别的方法。最基本的方法则是:

图片

  • “RGB转灰”将图片转换为灰度图,去除颜色信息干扰;

  • “切割/缩放至相同尺寸”是为了保持一致性、防止失真,避免图片在尺寸变化时产生失真和形变,从而确保图片的质量和准确性,也避免因为图片的尺寸不同,影响判定结果。

    同时,缩放和切割,也可以减少图片处理过程中的计算量,提高效率;

  • “获取图片之间的差异性”有很多方法,例如特征提取和匹配,使用特征提取算法来提取图片中的特征点,并使用特征匹配算法来匹配两张图片中的特征点。这种方法可以在一定程度上容忍平移、旋转、缩放等变化。

    例如局部比较,将图片分成小块,分别比较每个小块之间的相似性。这种方法可以帮助排除局部变化所引起的影响。

    例如结构化比较,将图片转换为结构化数据(例如直方图、颜色直方图、梯度直方图等),然后比较结构化数据之间的相似性。

    例如深度学习方法,使用深度学习模型来学习图片的表示,并进行图片的比较和匹配;

  • “找到图片之间的差异区域”在获取图片之间的差异性之后,常通过阈值化处理和边界检测等方法,圈出对比图片间差异区域。

    其中,阈值化处理是将差异区域和背景分离开来。而边界检测算法(或者轮廓检测算法),则是圈定差异区域的边界;

  • “标记差异区域”则相对简单,将检测出的差异区域编辑,通过一定的轮廓形状(如矩形)和颜色(如红色)在原图种标记出来。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

简单阐述了设计方案,接下来让我们看看具体实现方法。

具体实现

本文中,我们使用python的OpenCv模块来实现我们的需求。

如下图3、图4所示,是我们将图1、图2灰化处理后的图片。将彩色图片转为灰度图,只需一行代码即可:

gray_img1 = cv2.imread(img1, cv2.IMREAD_GRAYSCALE)gray_img2 = cv2.imread(img2, cv2.IMREAD_GRAYSCALE)

即,通过cv2.IMREAD_GRAYSCALE将原始图片作为灰度图读入。

图片

图3.img1灰度图gray_img1

图片

图4.img2灰度图gray_img2

在本文中,通过将gray_img2灰度图调整为gray_img1灰度图大小,保持两张图片的大小一致。

height1, width1 = gray_img1.shape[:2]height2, width2 = gray_img2.shape[:2]gray_img2 = cv2.resize(gray_img1, (width1, height1))

如下图5所示,为gray_img2和gray_img1通过结构相似性计算得到的差异图。

(score, diff) = structural_similarity(gray_img1, gray_img2 , full=True)diff = (diff * 255).astype("uint8")

图片

图5 gray_img1和gray_img2差异图

获取差异图后,再经过阈值处理和边界检测,获得差异性区域。通过矩形圈出原图中,具有差异的区域。具体如下图6、图7所示:

thresh = cv2.threshold(diff, 0, 255,                       cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,                        cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)for c in cnts:    # images differ    (x, y, w, h) = cv2.boundingRect(c)    cv2.rectangle(img1, (x, y), (x + w, y + h), (0, 0, 255), 2)    cv2.rectangle(img2, (x, y), (x + w, y + h), (0, 0, 255), 2)

图片

图6.img1差异性区域判定图

图片

图7.img2差异性区域判定图

结果对比

让我们来看看自动化获取图片差异性的结果与真实差异区域结果的对比,即:让我们来看看以上方法的优良。

如下图8所示,为img2原始图,图9为自动化识别差异区域结果图,图10为人工识别的差异区域结果图。

图片

图8.img2原始图

图片

图9.自动化识别结果图

图片

图10.人工识别结果图

不难看出,自动化识别的结果正确性为2/3,其中最右侧绿色球形部分没有正确检测出来。除此之外,图9中还有许多虚假差异性区域被检测出来了。

那,这是不是说,我们自动化识别的效果不理想呢?更或者,有人会跳出来说:你这结果差太远了,还不如不做!

其实,并非如此。绿色球形部分没被检测出来,是因为本文中使用的图片灰化方法,将彩色图片转为灰度图时,会丢失某些色彩信息,导致在灰化后,相同的结构、灰度相近的颜色不会被检测出来。

而其中增加了许多虚假区域的检测结果,是因为本文是直接截取的网站图片,原始大小和边界具有一定差异性(最明显的就是图9中,上下边缘被标记的红色线条区域),导致检测结果有一定误差性。

本文中,只是选择了最基本的实现方法为例,阐述自动化识别在图片中的作用。

虽有误差,但正确性依然可圈可点。由此可见,自动化识别在我们ui自动化测试中(例如图片识别、图片对别等)有一席之地,可以帮助我们提升某些场景下(例如发布一张图片或上传一个头像,通过自动化测试的方式判定发布后的图片的正确性)测试效率。

在文章的最后,想问大家:对于本文中出现的两个检测性误差问题,要如何解决呢?

  • 1) 彩色图片灰化,丢失色彩信息,导致检测误差;

  • 2) 图片截取,原始大小和边界具有一定差异性,导致检测误差;

欢迎大家积极留言互动~

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/11183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【功能实现】新年贺卡(蓝桥)

题目分析: 想要实现一个随机抽取功能 功能拆解:题目给了数组,我们采用生成随机数的方式,随机数作为数组的索引值访问数组的值。 并返回获取到的值,将获取到的值插入到页面中。 document.addEventListener(DOMConten…

蓝桥杯嵌入式学习笔记(6):IIC程序设计

目录 前言 1. IIC基本原理 2. 电路原理 3. 代码编程 3.1 预备工作 3.2 AT24C02写读功能编写 3.2.1 AT24C02写操作实现 3.2.2 AT24C02读操作实现 3.3 MCP4017写读功能编写 3.3.1 MCP4017写操作实现 3.3.2 MCP4017读操作实现 3.4 main.c编写 3.4.1 头文件引用 3.4.…

面试算法-94-将有序数组转换为二叉搜索树

题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中,我们用Go的标准库来实现了服务器,JSON渲染重构为辅助函数,使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑,这是所有编写无依赖HTTP服务器的人都会遇到的问题,除非服务器只处理一到…

Ubuntu 配置 kubernetes 学习环境,让外部访问 dashboard

Ubuntu 配置 kubernetes 学习环境 一、安装 1. minikube 首先下载一下 minikube,这是一个单机版的 k8s,只需要有容器环境就可以轻松启动和学习 k8s。 首先你需要有Docker、QEMU、Hyperkit等其中之一的容器环境,以下使用 docker 进行。 对…

C++第十三弹---内存管理(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、operator new与operator delete函数 1.1、operator new与operator delete函数 2、new和delete的实现原理 2.1、内置类型 2.2、自定义类型 …