基于图片对比的页面自动化测试实践

简介: 本篇文章的封面是1973年的花花公子女郎Lena,直到1988年,她才知道自己已经被从事图像处理行业的工作者所熟知。如今,数字图像处理技术越来越广泛地应用到我们的生活和工作中,比如一些图片的后期制作、军事领域方面以及广告设计方面。而将这一技术引入到软件测试中,也是最近几年才流行起来的。本文讲诉了阿里的测试开发工程师如何将图像对比技术嵌入到整个自动化流程中去,给读者提供了一个过程和结果都可以借鉴和参考的机会。

1.背景

背景

收到邀请,去参加北京NCTS云测试行业峰会-技术专场,准备将图片对比在测试自动化领域的实践分享给大家,本文作为分享议题的概述版本,供大家查看。

1.1 软件公司 VS 互联网公司

从软件发布来看软件公司与互联网公司的差异。

1.png

1.2 QA 的职责
1.2.1 软件公司
在软件公司,QA 的职责包括:

  • 研发环节的最后一环;
  • 在研发过程以尽可能多的发现 Bug 作为主要职责,在发布后以 0 Bug 作为主要目标;
  • 流程的推动者、权限的制约者。

1.2.2 互联网公司
在互联网公司,QA 的职责包括:

  • 全流程的质量体系;
  • 工具平台的发起者、创造者;
  • 捍卫真实的用户体验。

1.3 实时质量
实时质量的定义是”运行含测试,实时可反馈”

一句话总结来说就是:将质量手段以模块、组件乃至系统化的方式嵌入到业务型应用中。从代码的纬度来看:

  • 开发写的代码是为业务特性服务的代码;
  • 测试写的代码是为业务质量服务的代码。

1.4 无人值守自动化
无人值守自动化的定位是:基于变更,提供全流程、多样化、智能化的无人值守诊断能力,做到质量的实时反馈。

  • 全流程看护

变更前(预发阶段)

变更中(灰度阶段)

变更后(上线阶段

  • 覆盖所有变更

代码类变更

配置类变更

DB 变更

  • 多维度诊断

自动化诊断

业务监控诊断

业务日志诊断

  • 发布门禁
  • 发布准入

预发阶段和灰度阶段发布卡口

1.5 高频集成的现状
目前我们 BU 在并行的开发着多个特性,每个特性创建了不同的分支, 很难在一个相同的时间点进行统一的持续集成,多个分支可以自由的集成和发布,处于高频集成的状态。这也为回归测试带来了极大的挑战。

image.png

1.6 BU 的分层自动化模型
我们 BU 的分层自动化模型共分 4 层,展示层、接口层、服务层、数据层,每一层在不同的执行阶段与左侧的自动化框架&平台对接。层级越高,稳定性越差,自动化的效果越好。在生产运行阶段进行故障诊断和线上压测;预发布阶段进行运营 CMS 变更和预发布自动化;开发/功能调试阶段进行无线组件和适配测试。

image.png

1.7 MyDiff
MyDiff 是一个零成本配置的截图对比自动化平台

包含了以下特性:成本低、预发布拦截、全屏与区域截图、自定义的前置操作、多浏览器、多语言。

2.概述

2.1 业务与能力
从左侧来看,对接了 GAEA、TESLA 等自动化平台和 AONE 研发协同平台,PI 为算法平台,为我们提供了算法能力。

MyDiff 目前服务了 10 个 BU,产品能力包含任务管理、结果管理、执行机管理、数据统计、告警通知、平台对接等。

核心能力为截图能力和对比能力。截图能力包含对环境、登录、区域、前置操作的管理;对比能力分为像素级和非像素级两种,提供了相似度评估和差异标定。目前应用的场景包括页面回归测试、页面巡检、页面异常检测、适配测试,还有更多的场景等待探索。

image.png

2.2 自动化流程体系
自动化测试构建在协同平台 aone 的发布流程中,在开发提交代码进行预发布后,会同时进行 STC 安全扫描、CodeReview 和自动化测试等处理。盖亚接收到 aone 的消息通知,通过分层进行自动化框架的任务调度,待自动化执行完毕,将执行结果进行反馈,通知 aone。如果自动化执行失败,可以通过配置决定是否卡发布。

image.png

3.实践

3.1 技术架构
用户通过 web 集群来进行操作,如任务管理、任务执行等。MyDiff 为分布式应用,所以需要一个共享存储层,包含 mysql、oss 等存储。整个平台通过 RocketMQ 的消息进行通信,用户在 web 创建任务后,会将其包装成 captureTask,该任务控制执行机集群进行截图操作,待截图完成后,封装成 imgDiffTask,在图片对比集群进行对比操作,完成对比后更新任务状态,用户可查到报告结果。

image.png

3.2 图片对比算法优化
MyDiff 在常规方案中加入了形态学的一些算法操作,在获取像素差值图后,对差值图首先进行形态学膨胀处理,将分散的差值像素点膨胀成一个个连通区域。为避免膨胀后差异区域扩大,在形成连通区域后再对其进行形态学腐蚀。这样就能将原本分散的像素点或小区域,融合成一个个连通区域,差异区域的标记也更加友好。原本一串文本不同,通用算法会标记出多个区域,由于字符间欧式距离很小融合后会形成完整的一个连通区域。差异区域融合后,后续模板匹配的性能与精准性也会更好。

image.png

3.3 非像素级图片对比
3.3.1 需求
在无线端不同的机型有着不同的分辨率,所以同一个 UI 的两张截图也不尽相同。比如下图,存在着 3 个明显差异,头部导航栏、弹出的 toast、底部栏。卡号、文本框、按钮等虽然尺寸不同,但内容相同,在预期中它们是一致的。

image.png

3.3.2 算法
我们初步对 362 组样本进行算法实验,下表是实验结果,实验证明 SSIM+Phash 的算法效果最优,识别率可达 86.74%。

image.png

SSIM(结构相似性算法):

image.png

Phash(感知哈希算法):

image.png

3.3.4 差异标定
这是最终差异标定的结果,我们认为不同机型的头部导航栏和底部栏属于系统区域,在图片对比之前将其裁剪掉。下一步再对两张图进行结构提取,提取后左图元素与右图元素进行相互匹配,在另一张图找不到的元素被认为差异,通过红色矩形框出。

image.png

3.4 卡发布
卡发布的实践是在持续集成中的集成测试环节进行自动化的执行和验证,可配置的在自动化执行失败时是否允许发布。

3.4.1 新建 UI 测试
这里用阿里巴巴的协同平台 aone 来举例,通过 aone 创建一个 UI 测试任务,在页面中选择使用哪一个服务,其中 IMGDiff 代表 MyDiff,接下来设置图片对比任务 ID,将测试任务与 MyDiff 的任务 ID 相关联。

image.png

3.4.2 流程配置
下一步是在流程配置中添加流程,可以自定义一个流程的步骤。

image.png

3.4.3 日常发布流程
以一个日常发布的流程举例,日常集成测试在流程之中。对日常环境部署成功后,会执行配置的测试任务,调用 MyDiff 进行一次图片对比任务的执行。

image.png

3.4.4 卡发布案例
这里是一个真实的案例,持续集成中,MyDiff 自动化执行失败,测试人员可以通过查看结果来分析失败原因,也可以选择跳过进行继续发布。

image.png

3.4.5 MyDiff 案例
3.4.5.1 列表
这是 MyDiff 的执行结果列表,相同数与总数相等,执行通过。

image.png

3.4.5.2 详情
这是一次执行失败的详情,使用了区域截图。

image.png

3.4.5.3 原图差异
预发环境区域截图:

image.png

线上环境区域截图:

image.png

3.4.5.4 对比图差异标定
差异对比图:

image.png

通过差异对比图来使用户很快定位的差异的区域,一目了然。

4.规划

每一个平台都需要不断升级,技术也在不断发展,MyDiff 计划未来在以下领域进行提升。

image.png

5. 最后想说

感谢主办方的辛苦筹备,使大家能开心的在10月26号的技术专场再次见面,畅聊技术;虽然9月经历了一些小小的插曲,但总体而言十分圆满,期待未来再见。

致敬那些对技术充满热情的人。

文章来源:AlibabaTechQA
开发者社区整理

相关文章
|
12天前
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
36 2
|
20天前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
17天前
|
测试技术 UED
软件测试的艺术与实践
【10月更文挑战第9天】 在数字时代的浪潮中,软件成为了我们生活和工作不可或缺的一部分。然而,高质量的软件背后,是无数测试工程师的默默付出。本文将通过深入浅出的方式,探讨如何进行高效的软件测试,确保软件产品的质量与稳定性。我们将一起揭开软件测试的神秘面纱,从基础理论到实际操作,一步步走进这个充满挑战与创造的世界。
|
19天前
|
运维 监控 Devops
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为一种文化和实践,它倡导开发(Dev)与运维(Ops)之间的协作与整合。本文将引导读者了解如何通过自动化部署和持续集成(CI)的实践来提升软件交付的速度和质量。我们将探讨一些实用的工具和技术,以及它们是如何帮助团队高效地管理代码变更、测试和部署的。文章将不包含代码示例,但会详细解释概念和流程,确保内容的通俗易懂和条理性。
124 62
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的边界:从基础到高级的实践之旅
【10月更文挑战第21天】 在当今数字化时代,软件已成为我们生活和工作中不可或缺的一部分。随着技术的快速发展,对软件质量的要求也日益提高。本文旨在通过深入浅出的方式,带领读者踏上一场从基础到高级的软件测试实践之旅。我们将探讨软件测试的基本概念、重要性以及如何有效地进行测试规划和执行。通过具体案例分析,揭示常见错误及其解决方案,同时展望未来软件测试领域的发展趋势。无论你是软件开发新手还是经验丰富的测试工程师,这篇文章都将为你提供宝贵的见解和启发。
19 8
|
2天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
5天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【10月更文挑战第21天】在现代IT基础设施的管理中,自动化运维已成为提升效率、降低错误率的关键。Ansible,作为一种简单而强大的自动化工具,正被广泛应用于配置管理、应用部署和任务自动化等领域。本文将引导你了解Ansible的基本概念,通过实际案例展示如何利用Ansible简化日常运维工作,并探讨其在现代IT运维中的应用价值。无论你是新手还是有经验的系统管理员,这篇文章都将为你开启Ansible的高效之旅提供指导。
|
5天前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
13 1
|
6天前
|
SQL Java 数据库
Spring Boot与Flyway:数据库版本控制的自动化实践
【10月更文挑战第19天】 在软件开发中,数据库的版本控制是一个至关重要的环节,它确保了数据库结构的一致性和项目的顺利迭代。Spring Boot结合Flyway提供了一种自动化的数据库版本控制解决方案,极大地简化了数据库迁移管理。本文将详细介绍如何使用Spring Boot和Flyway实现数据库版本的自动化控制。
9 2
|
8天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
37 2