当前位置: 首页 > news >正文

移动端精准测试简介

 在测试领域每隔一段时间,就会有一些主流的测试技术,比如说:接口自动化,WebUI, AppUI自动化,然后就是测试平台的开发,各类专项测试(性能,安全),再到前几年的手机集群云测平台,现在的流量回放结合机器学习,人工智能处理用例,图像识别,还有就是精准测试。这就要求我们要持续学习,否则就会落伍。这两年在公司有幸接触到了比较流行的精准测试,并负责移动端精准测试的建设,现在已经小有成就,准备写个文章,总结一下。

一,精准测试简介

    精准测试是基于源代码变更分析,结合一些分析算法,从而确定改动代码影响的范围,设计测试用例进行针对性测试,一方面可以提升测试效率,另一方面精准测试还可以将测试用例与程序代码之间的逻辑映射关系建立起来, 而这个过程则是通过工具去采集测试过程执行的代码逻辑及测试数据。

如果你去网上搜索相关信息的话,也能看到非常多的内容,如:

1,精准测试技术十年发展漫谈:星云的精准测试 https://testerhome.com/topics/34557;

2,阿里/蚂蚁文件级RTS:http://users.ece.utexas.edu/~gligoric/papers/GligoricETAL15Ekstazi.pdf

3,字节跳动SmartEye:https://mp.weixin.qq.com/s/wUrm8gycgLHhCSHbpG8Hkw

4, Facebook Predictive Test Selection:https://engineering.fb.com/2018/11/21/developer-tools/predictive-test-selection/

https://research.facebook.com/publications/enhancing-genetic-improvement-of-software-with-regression-test-selection/

5,学术界Hybrid Regression Test Selection:http://lingming.cs.illinois.edu/publications/icse2018.pdf

6,走出回归测试困境,爱奇艺精准测试体系建设:https://xie.infoq.cn/article/781b1a4fa4aca12e38caf86aa

    基本的原理和实现逻辑都差不多,没有多高深的东西,至于为什么要做精准测试,精准测试要解决的问题等,在此就不再赘述。但是真正做起来的时候就会发现,中间的太多的实现细节,有很多技术难点需要进行攻克。

二,移动端精准测试

1,移动端精准测试现状

    目前做服务端精准测试的较多,原因是服务大多是使用java开发的,语言比较集中,遇到问题方便处理;同时服务端可以借助于接口自动化,快速实现用例推荐,提高测试覆盖率,投入产出比较较高。而移动端就比较复杂了,具体表现在:

(1)开发语言较多:如Android就有java , kotlin; iOS的有OC, Swift;每种语言就是不同的体系,相应的工具,处理方案都不相同;

(2)开发模式复杂:如果一个应用采取原生的开发模式,还相对简单点;混合模式的开发普遍存在,如原生模式+Flutter+H5等,OC与Swift混合开发,不说其他的,就算是只采集覆盖率,就相当麻烦。

(3)手机设备系统间,版本间的相应影响;一个好的应用要兼容常用的设备系列,这有相当多的开发同学进行兼容处理;而做精准测试想要做到兼容设备,兼容应用其中的工作量是非常大的,所以很多现有的移动端精准测试会针对特定的产品和设备进行开发。

(4) 不同厂商定制的系统。现在不少厂商都号称自研手机系统,虽然底层都是Android系统,但是为了显示与其他人不同,都会做一些定制化的东西,反而让系统的兼容性不好,很多原来的工具无法使用。Android系统的升级,兼容性做的也不好,比如升级到Android13后,原来的蓝牙相关的功能就会受到影响。

2,精准测试整体架构

    经过两年左右的开发,差不多已经实现一套完整的精准测试体系,以最小的成本在产品中引入精准测试,在测试同学无感的情况下进行覆盖率测试;在测试同学关联了相应用例的基础上,自动化实现整体精准测试体系的测试与分析。移动端精准测试整体架构如下:

图片

大致分为如下几个模块:

  •  全流程功能:可提供全流程的打包平台打包,自动注入覆盖率SDK,链路分析,用例推荐,自动执行推荐的AppUI自动化用例,生成推荐的手工用例集,以及生成AppUI执行的用例报告。
  •  覆盖率分析:借助于覆盖率SDK采集覆盖率数据,提供支持各个需求的覆盖率测试,每天,每个人的用例执行覆盖率情况;同时支持测试阶段跨版本覆盖率合并,生成回归测试阶段覆盖率报告。
  •  关联用例:支持通过用例管理平台关联手工用例,同时可以通过DeepLink关联AppUI用例。用例关联后可生成正向,逆向追溯关系。
  •  链路分析:根据不同的分支,版本,借助于java-callgrpah和clang二次开发生成调用关系,最终生成diff对应的调用链路,用于评估开发代码的影响范围,指导业务同学编写用例。
  •  用例推荐:根据diff情况,自动推荐出与本次diff相关手工和AppUI自动化用例,帮助业务同学进行测试范围评估,精简测试用例,缩小测试范围。
  •  Android/iOS Agent :通过不同的代理服务,解决覆盖率报告生成,覆盖率文件解析/合并,用例关联等具体的操作,由于Android和iOS的处理数据对系统要求不同,必须分开进行处理。
  •  覆盖率SDK: 基于jacoco , XcodeCoverage和Swift本身的覆盖率采集功能 ,实现自动注入覆盖率采集插件,覆盖率数据的收集与上报,用例关联时接收用例信息与控制覆盖率的采集。
  •  调用链路服务:Android通过反编译apk,解析Class文件 ,借助于java-callgraph.jar工具生成Android的调用关系数据 ,并生成树型调用链路。iOS通过优化clang,加上解析脚本生成调用关系数据,导入到CCG服务生成静态调用链路,并存储调用数据,提供调用链路查询,分支或自动对比不同的函数列表等功能。

3,精准测试工作流程

    通过对精准测试核心模块的建设,开发了精准测试平台来完成相应的工作流程,打通与其他相关平台的交互,最终形成一套完整的移动端精准测试体系。具体的工作流程如下:

图片

最后通过平台化的页面,为测试同学提供更加简洁的操作,更加清晰化的数据效果展示。

4,移动端精准测试的使用

移动端精准测试已经日常测试工作流程中投入使用,任何一个需求都要走精准测试环节。

(1)需求测试评估

  • 对于新的需求,可以根据覆盖率评估测试的效果,通过增量覆盖率来分析测试遗漏,补充测试用例,以提高测试覆盖率。对于日常需求,增量覆盖率必须达到80%以上,对于覆盖率低的要给出分析结果 。
  • 在发版环节,走精准测试全流程,根据与上一个版本的diff结果,自动推荐出回归测试的测试用例集。然后测试同学再根据调用链路分析,测试用例集执行的覆盖率,来评估回归测试的效果。同时可以补充或是反馈推荐出来的测试用例,使回归测试达到最佳效果。

下面是某周的需求测试数据:

图片

 根据需求增量覆盖率的数据,来评估需求测试的进度和效果,分析测试的范围。

(2)测试质量评估

    对于所有的精准测试情况,可以从数据大盘中进行分析,从而来评估一段时间的测试质量。

图片

(3) 精确定位回归范围

     常规的App发版前都会进行checklist的回归,一个中型规模的应用差不多也要几百条测试用例。发版前回归checklist是为了防止新功能对原来的功能产生影响,通过精准测试可以精准定位本次版本修改的代码 ,通过调用链路来评估新功能的影响,结合调用用例与代码的追溯关系,在一定的推荐算法的推荐下,以最少的测试用例集来达到最大的覆盖率范围。

    我们常规的checklist有两千多条用例,通过精准测试的推荐用例,每次发版回归可以精减50%以上的用例,而增量覆盖率达80%以上,极大的增加了发版的信心。随着使用频率的增量,用例与代码关联更加精准,节省的人日会越来越理想。

三,总结

     目前精准测试已经在日常测试工作中进行使用,在测试中对每个需求的质量数据更加清晰,提高了测试效果,增加测试同学的信心;但是还没有更好地发挥出精准测试的效果,需要在以下几个方面增加投入的精力:

1,优化推荐算法

    由于移动端的特点,加上测试同学对业务和代码的理解程度不同,在用例录制环节会录制较多的与测试点关系不大的前置和后置操作步骤。所以在整体精准测试使用的阶段,发现用例推荐环节准确率不够,从而在降低测试人员的工作量上没有达到理想的状态。后续考虑引入机器学习相关算法,增加测试用例的数据指标,让用例推荐更加准确,辅助测试同学的测试更加精准。

2,测试用例精简

    测试同学在编写用例的,如果没有按要求来写,会存在大量的重复操作,用例覆盖路径几乎相同,就最后几步不同,对于这样的用例,可以根据用例执行过程中对代码的覆盖,计算用例的相似度。通过相似度来供测试同学进行用例精简,对于相似度高的用例进行合并或是删除,以达到用最少的用例覆盖最多的功能。

3,加强与开发的合作

    增强与开发人员的合作,通过链路分析来界定需求修改的内容,以便更精确的编写测试用例;通过增量报告来分析测试效果,或是定位bug。当然精准测试平台也需要根据大家的使用情况,来提供更多方法和维度分析手段,以便更好地为大家服务。

相关文章:

移动端精准测试简介

在测试领域每隔一段时间,就会有一些主流的测试技术,比如说:接口自动化,WebUI, AppUI自动化,然后就是测试平台的开发,各类专项测试(性能,安全),再到前几年的手机集群云测平…...

CCProxy代理服务器地址的设置步骤

目录 前言 一、下载和安装CCProxy 二、启动CCProxy并设置代理服务器地址 三、验证代理服务器设置是否生效 四、使用CCProxy进行代理设置的代码示例 总结 前言 CCProxy是一款常用的代理服务器软件,可以帮助用户实现网络共享和上网代理。本文将详细介绍CCProxy…...

探秘分布式神器RMI:原理、应用与前景分析(二)

本系列文章简介: 本系列文章将深入探究RMI远程调用的原理、应用及未来的发展趋势。首先,我们会详细介绍RMI的工作原理和基本流程,解析其在分布式系统中的核心技术。随后,我们将探讨RMI在各个领域的应用,包括分布式计算…...

[项目设计] 从零实现的高并发内存池(三)

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 ​ 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…...

将Q算法和D算法结合应用到llm解码上之人在回路

将Q算法和D算法结合应用到llm解码上之人在回路 参考地址代码解释 参考地址 https://dongfangyou.blog.csdn.net/article/details/136466609 代码 import numpy as np from tqdm import tqdmfrom sample import net, char2id_dict, get_real_p# 假设的词汇表 VOCABULARY lis…...

el-table-column嵌套el-form-item不能进行校验问题解决

项目为vue3elementPlus开发的项目 业务要求:table表格展示数据,其中有一行是ip地址可展示可修改,此处要求增加自定义校验规则 先看一下效果: 此处先描述一下,问题出在了哪里,我将el-table的data,使用一个…...

leetcode200. 岛屿数量

leetcode200. 岛屿数量 题目 思路 遍历每一个网格,若网格为1,岛屿数量1,利用一个深度优先搜索函数将岛屿置零,注意判断数组边界 代码 class Solution:def numIslands(self, grid: List[List[str]]) -> int:self.grid grid…...

MySQL--索引类型详解

索引的类型 主键索引: PRIMARY KEY,当一张表的某个列是主键的时候,该列就是主键索引,一张表只允许有一个主键索引,主键所在的列不能为空。 创建主键索引的SQL语法: # 给user表中的id字段创建名为id_ind…...

R语言中ggplot2图例位置、颜色、背景、标题

目录 1、不显示图例 2、自定义图例位置 3、修改图例背景颜色、外框颜色、大小 4、修改图例大小 5、图例设置背景、线框为空 6、自定义设置多个图例的标题 7、设置多个图例的之间的间隔 8、取消不需要的图例显示 1、不显示图例 theme(legend.position "none"…...

波卡 Alpha 计划启动,呼唤先锋创新者重新定义 Web3 开发

原文:https://polkadot.network/blog/the-polkadot-alpha-program-a-new-era-for-decentralized-building-collaboration/ 编译:OneBlock 区块链领域不断发展,随之而来的是发展和创新机会的增加。而最新里程碑是令人振奋的 Polkadot Alpha …...

公网IP与私有IP及远程互联

1.公网有私有IP及NAT 公网IP是全球唯一的IP,通过公网IP,接入互联网的设备是可以访问你的设备。但是IPV4资源有限,一般ISP(Internet Service Provider)并不会为用户提供公网IP。所以家里的计算机在公司是没法直接使用windows远程桌面直接访问…...

openCV xmake debug失效 release可以使用

在使用xmake构建一个项目时,添加openCV库,调用 imread函数时,debug函数失效, release可以使用,最后发现是xmake.lua写的有问题 option("OpenCV4.6.0")set_showmenu(true) set_default(true) set_category(&…...

ES分布式搜索-IK分词器

ES分词器-IK 1、为什么使用分词器? es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试: GET /_analyze {"analyzer": "…...

基于卷积神经网络的野外可食用植物分类系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细探讨了一基于深度学习的可食用植物图像识别系统。采用TensorFlow和Keras框架,利用卷积神经网络(CNN)进行模型训练和预测,并引入迁移学习模型…...

Raingad IM即时聊天/即时通讯网站源码,附带系统搭建教程

支持功能 支持单聊和群聊,支持发送表情、图片、语音、视频和文件消息单聊支持消息已读未读的状态显示,在线状态显示群聊创建、删除和群成员管理、群公告、群禁言等支持置顶联系人,消息免打扰;支持设置新消息声音提醒,…...

for语句的实际应用(3)

3145:【例24.3】 奇数求和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9847 通过数: 5442 【题目描述】 计算非负整数 m 到 n(包括 m 和 n)之间的所有奇数的和,其中,m 不大于 n,且 n 不大…...

c++ Windows获取软件安装列表信息

链接 #include <windows.h> #include <stdio.h> #include <iostream> #include <vector>using namespace std;#ifndef MSVCR #define _T #define _tcscpy strcpy #define _stprintf sprintf #define _tcscmp strcmp #endifclass SetupSoftInfo { publ…...

音视频学习笔记——c++多线程(一)

✊✊✊&#x1f308;大家好&#xff01;本篇文章主要整理了部分多线程相关的内容重点&#x1f607;。首先讲解了多进程和多线程并发的区别以及各自优缺点&#xff0c;之后讲解了Thead线程库的基本使用。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统…...

消息队列常见问题

总的来讲&#xff0c;消息队列常见问题要么消息不能多&#xff0c;要么不能少&#xff0c;还有顺序性&#xff0c;以及积压处理的问题等。 1.消息不能多 也就是说&#xff0c;消息不能重复消费&#xff0c;随之带来的幂等性问题。 解决&#xff1a;一般结合业务场景&#xf…...

【leetcode热题】二叉树的前序遍历

难度&#xff1a; 中等通过率&#xff1a; 49.5%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1\2/3 输出: [1,2,3]进阶: 递归算法很简单&#xff0c;你可以通过迭代…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...