软件测试技术之跨平台的移动端UI自动化测试(上)
摘要:本文提出一种跨平台的UI自动化测试方案,一方面使用像素级的截图对比技术,解决传统UI自动化测试难以验证页面样式的问题;另一方面用统一部署在服务器端的JavaScript测试代码代替Android和iOS测试代码,大大提高编写测试代码的效率。该方案经过实际验证,具有效率高、质量好、便于维护等多方面优点,文中将阐述具体设计思路以及各关键步骤的实现方法,为同类测试提供借鉴。
一、 背景
当前金融服务数字化、信息化和智能化趋势日益明显,在遵守法律法规、行业及公司制度、业务规则等多方面要求的前提下,面对瞬息万变的客户需求,金融行业的移动客户端越来越多采用敏捷开发的工程实践,灵活选用技术框架、平台和语言,持续迭代升级,优化客户体验。
日益频繁的需求变更所带来的不单是系统开发模式的变迁。质量控制方面,移动客户端需要适配的屏幕尺寸和机型多种多样,测试不仅要验证页面元素内容的正确性,还需验证各个元素的显示效果。而传统的页面自动化测试大多以断言的形式来验证页面元素的内容,无法验证视觉上的显示效果,在实际应用中,往往起不到实际作用,反而降低了测试效率。如何利用自动化方法更高效地完成庞杂的测试工作,成为敏捷开发模式下亟待解决的关键问题。
本文提出对比截图的方式,进行像素级别的UI测试,不仅可以验证内容的正确性,还可以验证视觉效果的一致。同时为了解决iOS和Android两个平台分别编写测试代码的重复工作问题,通过一个自主研发的测试工具包,把测试代码以JavaScript的形式部署在服务器端,通过HTTP协议下发到iOS和Android两个平台的多个测试设备分别执行,再把测试结果收集到服务器,大大提高了工作效率。
二、 跨平台的移动端UI自动化测试探索
(一) 测试思想
传统的自动化测试思想大多起源于JUnit这种单元测试框架,即使是页面级别的自动化测试,如Selenium等也多是通过断言语句检查页面上特定元素的属性值和推测结果是否一致。这种思想的自动化测试需要测试人员为所有待验证元素的属性值编写断言语句,不仅编写测试代码花时间费精力,也需要后期投入大量的维护成本。
即使拥有完整的自动化测试用例,项目中也不可能完全放弃人工测试,自动化测试和人工测试之间的相互关系,是制定项目测试方针时必须要考虑的顶层问题。一些适合人工去做的工作,例如验证页面元素的位置、颜色、线条粗细等断言语句不容易验证的内容,交给人工验证并无不妥,也是不可省略的步骤。而一些重复性的工作,例如修改了某个业务模块之后,系统中其他页面的显示效果在所有需要适配的设备上是否受到影响,没有修改过的其他业务流程是否会产生错误,这种回归性质的测试则要尽可能减少人工的参与。
在上述测试思想的指导下,工程师在UI自动化测试中使用一种“录制-截图-对比”的方法:
首先,按照正常流程编写测试用例、并且进行严格的人工测试,这一阶段与传统的人工测试完全一致。
然后,把经过测试过的页面,使用自动化脚本在所有测试设备上截图,把所有截图保存到服务器,这一步称为录制。
执行对比时,仍然使用自动化脚本对每一个页面截图,然后把截图和上一步的录制截图进行像素级的对比,保证每一个像素的一致,否则算作测试失败。这一步相当于传统自动化测试的断言部分,当前截图是执行结果,录制的截图是预期结果。
通过上述步骤,每一次修改后都进行一次自动化回归测试,可以保证当前时间节点上,系统内所有页面在所有设备上显示时,每一个像素都和上一次截图时一致,即使是1个像素的偏移也可以被轻松发现。
表1 传统自动化测试和跨平台移动端UI自动化测试的对比
(二) 验证流程
1、 服务端部署JavaScript测试代码
每个文件是一个测试用例,一个测试用例中可以有多个确认点。可以部署在Apache、Nginx等HTTP服务器上,只要提供一个测试设备可以访问的HTTP地址即可,往往可以把测试代码、模拟测试数据部署在一个地方。
2、 测试设备下载代码
首先在客户端配置测试用例的执行地址,执行测试用例时,先把测试用例的JavaScript代码下载到客户端然后交给JavaScript引擎执行。
3、 使用JavaScript引擎执行代码
除了WebView,各平台都有比较成熟的JavaScript执行引擎,关于JavaScript引擎的选择,可以参照后面的关键点说明。
4、 JavaScript调用Native(Java以及Objective-C)端插件执行命令
关于JavaScript与Native端的交互方法,可以参考后面的关键点说明。
5、 根据指令运行测试业务
真正执行业务逻辑的地方,根据业务特点,可能会有与外部系统的交互,开发人员需要为外部系统准备好模拟数据。
6、 页面截图
调用客户端的页面截图方法,保存为JPEG或者PNG形式。
7、 截图回传给服务器
实际上也可以把截图直接保存在客户端,日后只要在客户端进行比较即可,但是为了方便进行统一的比较和分析展示,更推荐把截图回传给服务器进行处理。
8、 截图对比
服务器在像素级别对比当前截图和标准截图是否一致,不一致则报错。标准截图是第一次经过人工测试之后录制的截图,执行测试用例时,可以指定是录制模式还是验证模式,如果是录制模式,只进行截图和保存。验证模式时,把当前的截图和上一次录制的截图进行对比。
9、 将判断结果返回移动端,完成测试
将判断结果返回移动端是为了在移动端显示统一的测试报告,因为移动端除了UI部分的截图对比,可能还会有文件、数据库等其他验证项目的断言语句。
(三) 关键点说明
无论是跨平台还是截图对比,在具体的技术选型上都有各种各样的组合可以选择,经过各种调查和尝试,对主流的开发语言、框架和中间件进行评估,我们摸索出一套完整的解决方案,经过两年时间在实践中不断的改善和优化,已经可以在生产环境中发挥重大作用,节约人力成本的同时还能提高测试质量。现在把一些最佳实践点的关键内容总结如下:
1、服务端部署JavaScript测试代码:测试代码结构
测试代码是一段标准的HTML代码,具体的测试指令以JavaScript的形式包含在
前面引用的native.js和testcase.js中包含了通用的工具代码,负责与移动端框架进行交互(交互方式后面会记述)。后面的
2、 测试设备下载代码:代码文件的解析
标准的HTML文件也是XML文件,所以我们按照XML的规则来解析代码,仅提取XML中script标签的内容即可,如果遇到script标签中带有src属性,需要另外再下载src指定的文件,最后将所有JavaScript代码拼接成一整段代码交给执行引擎。当然可以直接下载JavaScript文件来执行,但是考虑到传统的Web开发中JavaScript是被包含在HTML中的,故采取同样的思路,事实证明这种方式大大增强了扩展能力。
文章来源:网络 版权归原作者所有
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理
相关文章:
软件测试技术之跨平台的移动端UI自动化测试(上)
摘要:本文提出一种跨平台的UI自动化测试方案,一方面使用像素级的截图对比技术,解决传统UI自动化测试难以验证页面样式的问题;另一方面用统一部署在服务器端的JavaScript测试代码代替Android和iOS测试代码,大大提高编写…...
【MySQL--02】库的操作
文章目录1.库的操作1.1创建数据库1.2创建数据库的案例1.3字符集和校验规则1.3.1查看系统默认字符集以及校验规则1.3.2查看数据库支持的字符集1.3.3查看数据库支持的字符集校验规则1.3.4 校验规则对数据库的影响1.4操纵数据库1.4.1查看数据库1.4.2 删除数据库1.4.3显示创建语句1…...
人民链Baas服务平台上线,中创助力人民数据共建数据服务应用场景
人民链2.0是数据要素大发展时代下的可信联盟链 作为区块链分布式存储领域行业先驱与让人民放心的国家级数据云平台,中创算力与人民数据的合作从未间断。为了推动人民链2.0高质量发展,中创算力与人民数据开展了多方面合作,助力人民数据共建数据…...
说说如何借助webpack来优化前端性能?
通过webpack优化前端的手段有: ① JS代码压缩 ② CSS代码压缩 ③ HTML文件代码压缩 ④ 文件大小压缩 ⑤ 图片压缩 ⑥ Tree Shaking ⑦ 代码分离 ⑧ 内联 chunk 1、JS代码压缩 terser是一个JavaScript的解释、绞肉机、压…...
AiDD AI+软件研发数字峰会开启编程新纪元
随着OpenAI 推出全新的对话式通用人工智能工具——ChatGPT火爆出圈后,人工智能再次受到了工业界、学术界的广泛关注,并被认为向通用人工智能迈出了坚实的一步,在众多行业、领域有着广泛的应用潜力,甚至会颠覆很多领域和行业&#…...
【远程开发】VSCode使用Remote SSH远程连接Linux服务器
文章目录前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程转发自CSDN远…...
C++纯虚函数和抽象类详解
在C中,可以将虚函数声明为纯虚函数,语法格式为: virtual 返回值类型 函数名 (函数参数) 0; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上0,表明此函数为纯虚函数。 最后的0并不表示函数返回…...
服务器上搭建jenkins打包工具
一、环境准备 1.安装jdk,这里我安装的jdk8 https://www.oracle.com/java/technologies/downloads/#java8 2.安装jenkins,使用镜像地址安装 https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/?CN&OD 注意要选择支持当前安装的jdk版…...
全球化背景下,如何利用内容营销促进跨境电商业务增长
随着全球跨境电商市场的迅速发展,越来越多的企业开始将注意力转向跨境电商。然而,随着竞争的激烈化,企业不再能够仅仅依靠产品本身来吸引消费者的注意。因此,内容营销成为了跨境电商企业在吸引、留住消费者方面的关键。在这篇文章…...
数据库系统工程师——第二章 程序语言基础知识
文章目录📂 第二章、程序语言基础知识 📁 2.1 程序语言概述 📖 2.1.1 程序语言的基本概念 📖 2.1.2 程序语言的基本成分 📁 2.2 程序语言翻译基础 📖 2.2.1 汇编程序基本原理 📖 2.2.2 编译程序…...
UFT参数化的使用
使用Systemutil.Run打开程序。将01_Login/02_New Order/03_Logout三个操作分为3个Action。生成共享对象库关联到这三个Action。在01_Login操作模块中,将登录名和密码设置为环境变量参数,环境变量参数采用用户自定义,定义为AgentName和Passwor…...
Java模拟rank() over()函数获取分组排名的方法设计及实现
背景 考试批次班级姓名语文202302三年一班张小明130.00202302三年一班王二小128.00202302三年一班谢春花136.00202302三年二班冯世杰129.00202302三年二班马功成130.00202302三年二班魏翩翩136.00 假设我们有如上数据,现在有一个需求需要统计各学生语文单科成绩在班…...
不用但一定要懂 ---- iOS 之 响应链、传递链 与 手势识别
iOS 事件的主要由:响应连 和 传递链 构成。一般事件先通过传递链,传递下去。响应链,如果上层不能响应,那么一层一层通过响应链找到能响应的UIResponse。 响应链:由最基础的view向系统传递,first view ->…...
观早报 | 特斯拉储能超级工厂落沪;“华尔街之狼”募资550亿
今日要闻:京东拟今年发布千亿级产业大模型;特斯拉储能超级工厂落沪;“华尔街之狼”募资550亿;英特尔落户海南三亚;日本人要搞二次元老婆版 ChatGPT京东拟今年发布千亿级产业大模型 据《科创板日报》消息,京…...
SpringCloud集成Seata saga模式案例
文章目录一、前言二、Seata saga模式介绍1、示例状态图2、“状态机”介绍1)“状态机”属性2)“状态”属性3)更多状态相关内容三、SpringCloud 集成 seata saga1、saga模式状态机相关信息1)状态机配置相关的三个表2)状态…...
逍遥自在学C语言 | 位运算符的高级用法
前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序…...
Java实现输入行数打印取缔字符,打印金字塔三角形的两个代码程序
目录 前言 一、实现输入行数,打印取缔字符 1.1运行流程(思想) 1.2代码段 1.3运行截图 二、打印金字塔三角形 1.1运行流程(思想) 1.2代码段 1.3运行截图 前言 1.因多重原因,本博文有…...
express项目的创建
前言 前端开发者若要进行后端开发,大多都会选择node.js,在node生态下是有大量框架的,其中最受新手喜爱的便是老牌的express.js,接下来我们就从零创建一个express项目。 安装node 在这里:https://nodejs.org/dist/v16…...
RK3399平台开发系列讲解(基础篇)Linux 传统间隔定时器
🚀返回专栏总目录 文章目录 一、设置间隔定时器 setitimer()二、查询定时器状态 getitimer()三、更简单的定时接口 alarm()四、传统定时器的应用4.1、为阻塞操作设置超时4.2、性能剖析五、传统定时器的局限性沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将详细…...
Kafka 3.4.0 kraft 集群搭建
文章目录简介基础环境服务器三台安装下载安装初始化集群启动集群验证创建Topic查看Topic详情简介 Apache 软件基金会发布了包含许多新特性和改进的 Kafka 3.3.1。这是第一个标志着可以在生产环境中使用 KRaft(Kafka Raft)共识协议的版本。在几年的开发过…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
