• 0
  • 0
分享
  • UI 测试难题!自动化识别图片的正确率如何达到100%!——软件测试圈
  • 曼倩诙谐 2024-03-26 10:40:50 字数 2741 阅读 187 收藏 0

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

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

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

16-1.png

  方案设计

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

16-2.png

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

  “切割/缩放至相同尺寸”是为了保持一致性、防止失真,避免图片在尺寸变化时产生失真和形变,从而确保图片的质量和准确性,也避免因为图片的尺寸不同,影响判定结果。同时,缩放和切割,也可以减少图片处理过程中的计算量,提高效率;

  “获取图片之间的差异性”有很多方法,例如特征提取和匹配,使用特征提取算法来提取图片中的特征点,并使用特征匹配算法来匹配两张图片中的特征点。这种方法可以在一定程度上容忍平移、旋转、缩放等变化。例如局部比较,将图片分成小块,分别比较每个小块之间的相似性。这种方法可以帮助排除局部变化所引起的影响。例如结构化比较,将图片转换为结构化数据(例如直方图、颜色直方图、梯度直方图等),然后比较结构化数据之间的相似性。例如深度学习方法,使用深度学习模型来学习图片的表示,并进行图片的比较和匹配;

  “找到图片之间的差异区域”在获取图片之间的差异性之后,常通过阈值化处理和边界检测等方法,圈出对比图片间差异区域。其中,阈值化处理是将差异区域和背景分离开来。而边界检测算法(或者轮廓检测算法),则是圈定差异区域的边界;

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

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

  具体实现

  本文中,我们使用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将原始图片作为灰度图读入。

16-3.png

  在本文中,通过将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")

16-4.png

图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)

16-5.png

  结果对比

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

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

16-6.png

  不难看出,自动化识别的结果正确性为2/3,其中最右侧绿色球形部分没有正确检测出来。除此之外,图9中还有许多虚假差异性区域被检测出来了。那,这是不是说,我们自动化识别的效果不理想呢?更或者,有人会跳出来说:你这结果差太远了,还不如不做!

  其实,并非如此。绿色球形部分没被检测出来,是因为本文中使用的图片灰化方法,将彩色图片转为灰度图时,会丢失某些色彩信息,导致在灰化后,相同的结构、灰度相近的颜色不会被检测出来。而其中增加了许多虚假区域的检测结果,是因为本文是直接截取的网站图片,原始大小和边界具有一定差异性(最明显的就是图9中,上下边缘被标记的红色线条区域),导致检测结果有一定误差性。

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

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

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

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

  欢迎大家积极留言互动~


作者:刘晓佳Rachel    

来源:http://www.51testing.com/html/12/n-7800212.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   新浪科技讯北京时间1月4日上午消息,据报道,谷歌挖来了长期负责微软人工智能伦理工作的米拉·雷恩(MiraLane),加入该公司的技术和社会问题团队。  此举正值谷歌及整个科技行业因为日益复杂的人工智能模型而面临伦理挑战之际。  雷恩之前在微软领导一个综合学科团队,负责与伦理数据收集、生成式人工智能数据、人脸识别和负责任产品设计有关的问题。她加入谷歌后将向詹姆斯·曼伊卡(JamesManyika)汇报工作,后者一年前加入谷歌,出任技术及社会高级副总裁。这个成立不久的团队还吸引了苹果搜索业务前负责人斯里尼瓦森·万卡塔查理(SrinivasanVenkatachary)加盟。  雷恩本人已经确认...
            0 0 638
            分享
          •   据支付宝官微消息,2024 年 3 月份,境外宾客通过支付宝在国内的累计交易金额同比去年 3 月份增长近 10 倍,交易笔数同比增长近 8 倍,活跃用户数同比增长近 6 倍。  截至 2024 年 3 月,入境后使用支付宝 App 绑定国际银行卡的外国游客来自近 200 个国家和地区;其中,韩国、马来西亚、新加坡、美国、日本、泰国、德国、澳大利亚、英国、印度尼西亚是十大来源国。  据IT之家此前报道,中国人民银行官微近期发布了中英文双语的《外籍来华人员支付指南》(Guide to Payment Services in China),明确外籍来华人员可选择移动支付、银行卡、现金等一系列支付...
            0 0 230
            分享
          •        对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决。       MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的...
            12 13 2527
            分享
          •   如果说,2020年对于全世界来说,都是一场极大地挑战的话;那么,2021年绝对是机遇多多的一年。因为,随着疫情在全球范围内逐步得到控制,无论是国际还是国内的环境,都会呈现逐步回暖的趋势。  那么,2021年,软件测试行业的形式又会变得如何呢?行业从业者已经饱和了吗?如果饱和了,行业从业者将如何破局?如果没饱和,什么样的人适合走入这个行业呢?  2021年,软件测试行业趋势分析和热门招聘方向  今天,我们就这些问题,来聊一聊2021年软件测试行业的7大主流趋势。希望能解决一部分小伙伴心中的困惑。  软件测试行业前景怎样?  1)主观感受  之所以会有这么多人担心这个问题,主要还是因为很多想转...
            11 11 1653
            分享
          • day11、安装了python3.8,我是windows系统,下载完之后直接打开安装即可2、安装完之后,打开cmd命令,敲入python,出现带有python版本号信息就算安装成功了3、>>>符号表示进入了python环境,输入exit()可以退出python环境安装Python - 廖雪峰的官方网站 (liaoxuefeng.com)
            0 0 887
            分享
      • 51testing软件测试圈微信