当前位置: 首页 > 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;你可以通过迭代…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...