进化的覆盖率--实时代码染色
如果无法正常显示,请先停止浏览器的去广告插件。
1. e
t
s
e
T
o
rH
e
m
e
t
s
e
T
o
H
r
e
m
e
t
s
e
T
o
rH
e
m
2. e
t
s
e
T
o
rH
e
m
进化的覆盖率--实时代码染色色
e
m
o
H
r
te 蚂蚁金金金服——周为、翟帅
s
e
T
e
t
s
e
T
o
rH
e
m
3. 覆盖率是什什么
代码覆盖是软件测试中的一一种度量量,描述程序中源代码被测试的比比例例和程度,所得比比例例称为代码覆盖率。
e
t
s
e
T
o
rH
e
m
代码
e
t
s
e
T
o
H
r
e
m
插桩器
编译
插桩后代码
o
rH
运行行行
e
t
s
e
T
覆盖率数据
蚂蚁金金金服
e
m
4. 覆盖率的作用用
e
m
了解测试情况
o
H
r
e
t
s
e
T
形成质量指标 发现测试死角 找到历史废弃代码
作为版本发布的前置要求 多个测试用例都覆盖不到
的代码 收集方法覆盖率,为废弃
代码判断提供依据
度量自动化用例 帮助代码优化 精准回归
为自动化用例提供覆盖率
统计情况 分析热区代码,为优化提供
支撑 构建代码调用关系,自动
选择用例
测试过程中覆盖和未覆盖的地方,
可能存在的风险
常规覆盖率工工具
e
t
s
e
T
o
H
r
代码实时染色色
e
m
e
t
s
e
T
新型代码调试工具 辅助代码走读
帮助定位研发过程中的问题 使业务同学快速了解代码
蚂蚁金金金服
o
rH
e
m
5. 对覆盖率的理理解
e
t
s
e
T
o
rH
e
m
代码覆盖率是银弹
e
m
100%的覆盖率就能保证程序没有 bug
e
t
s
e
T
o
H
r
代码覆盖率是一一种度量量工工具
可以使用用它了了解测试的效果,发现测试的死⻆角,从而而实现精准测
试,为软件质量量保驾护航
No
e
Yes
m
o
H
r
e
t
s
e
T
蚂蚁金金金服
6. 覆盖率数据流图
研发流程打通
e
t
s
e
T
客户端
o
rH
e
m
质量量
卡点
人工测试
自动化用例
插桩
收集
上传
Monkey
线上用户
…
e
t
s
e
T
o
H
r
e
m
覆盖率服务端
计算
汇总
代码
调试
多维度
覆盖率数据
性能
优化
精准
回归
分析
用用例例
优化
e
t
s
e
T
…
蚂蚁金金金服
o
rH
代码
下线
e
m
7. e
t
s
e
T
o
rH
e
m
e
m
o
进化的覆盖率——服务端演化篇
H
r
e
t
s
e
T
e
t
s
e
T
o
rH
e
m
8. 覆盖率服务端演进 — 多模块 APP 本地覆盖率收集
o
rH
模块仓库
e
t
s
e
T
代码仓库
e
m
预编译模块
Bundle 1
拉取依赖
Bundle 2
Bundle 3
…
构建
拉取代码
目目标模块
代码
编译
插桩
插桩器器
e
t
s
e
T
目目标模块
产物
e
m
App
覆盖率包
o
H
r
联合计算
产生生
执行行行数据
覆盖率报告
编译中间产物
源代码
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
9. 本地覆盖率报告
e
t
s
e
T
o
rH
e
m
e
t
s
e
T
o
H
r
e
m
怎样支持多人协作?
怎样突出测试重点?
怎样推动覆盖率改进?
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
10. 覆盖率服务端演进 — 多用用户覆盖率在线收集计算
编译中间文文件
e
m
App 覆盖率包
e
t
s
e
T
o
rH
构建平台
构建
报告服务器
APP 覆盖率包
Bundle 1
手机
Bundle 2
Bundle 3
…
安装
上传覆盖率数据
e
t
s
e
T
操作 APP
App 覆盖率包
o
H
r
e
m
用用户
bundle 1
覆盖率服务
bundle 2
分割 计算
合并 生产报告
bundle 3
…
仓库 1
计算节点
仓库 2
仓库 3
构建
收集
计算
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
结果
11. 多用用户覆盖率在线收集计算产出物
多 bundle 统计
e
t
s
e
T
o
rH
e
m +
变更更覆盖率
e
t
s
e
T
o
H
r
e
m
业务线汇总
e
怎样让覆盖率 m
o
帮助提高测试效率?
H
r
e
t
s
e
T
蚂蚁金金金服
12. 覆盖率服务端演进 — 代码实时染色色
仓库服务
设备
o
rH
路路由/负载均衡
e
t
s
e
T
前端应用用
数据处理理
e
m
APP
实时处理理节点X多组
状态/控制数据流
连接控制器器
受控
收集模块
执行行行数据流
控制数据流
操作 APP
控制界面面
e
t
s
e
T
执行行行数据流
实时解析器器
计算进程
o
H
r
数据流
计算进程
设备
管理理
e
m
存储服务
会话
控制
报告渲染器器
数据推送
报告
渲染
数值
计算
e
t
s
e
T
报告展示
用用户
蚂蚁金金金服
o
rH
e
m
操作会话
13. 代码实时染色色产出物
e
t
s
e
T
o
rH
e
m
e
t
s
e
T
o
H
r
e
m
实时收集计算执行行行数据
+
独立立统计空间
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
14. 进化的覆盖率
e
m
o
H
进化的覆盖率——客户端演化篇
r
e
t
e
s
e
m
T 主讲人:翟帅
o
H
r
e
来自支付宝技术团队
t
s
e
T
负责业务:
负责iOS代码覆盖率系统研发
负责研发基于图像识别的自动化测试系统
e
t
s
e
T
o
rH
e
m
15. 客户端覆盖率技术演进
使用用开源方方案阶段:
e
m
单机阶段
e
t
s
e
T
o
rH
iOS使用用的gcov方方案
支支持多人人协作阶段
覆盖率数据dump时机可控
支支持App:
e
m
增加上传覆盖率数据功能
Android使用用的JaCoCo方方案
H5使用用istanbul方方案
将覆盖率数据与版本号绑定
e
t
s
e
T
o
H
r
部署到打包平台
?
e
m
遇到了了瓶颈
支支付宝部分组件
支支持App的全部组件
e
t
s
e
T
蚂蚁金金金服
o
rH
16. 来自自上帝的吐槽
数据到底有没有传上去o_O???
e
t
s
e
T
o
rH
e
m
我擦嘞覆盖率包又又crash了了!!!
还没有dump
完APP就被
kill了
我都测了了好几几遍了了,怎么还是没有数据!!!
难用
e
t
s
e
T
o
H
r
测毛毛线覆盖率啊:-(
咦?我测到这段代码了了,怎么显示没有覆盖?
啥时候才能看到报告啊?
装个覆盖率包慢死了了
e
m
gcov解析
gcno、gcda
过慢导致报告
生成不及时
没有在界面
上给用户明
确提示
插桩导致被
测App体积
严重膨胀
__gcov_flush
存在crash风险
客户端覆盖率
数据dump慢
gcov方案的缺陷
e
t
s
e
T
编译器的缺陷
蚂蚁金金金服
o
rH
e
m
17. 梦想还是要有的!
假如一遍边操作一边就能看到覆盖率的变化岂不是很爽!!!
e
m
o
怎么搞上帝才能满意?
H
r
e
t
s
e
T
嘿小哥醒醒别睡了!!!
做梦呢
覆盖率包体积还得小
e
t
s
e
T
o
H
r
e
m
跑的稳稳地
打包还得块
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
18. 移动端覆盖率技术演进
e
t
s
e
T
o
rH
e
m
H5实时覆盖率
一个基于流式的数据上报模块
改造istanbul
简化版本的istanbul
o
H
r
e
m
H5实时覆盖率
e
t
s
Android实时覆盖率
e
T
一个基于流式的数据上报模块
Android实时覆盖率
JaCoCo
e
t
s
e
T
o
rH
e
m
19. 自自研覆盖率技术iOS方方案架构图
打包平台
打包平台业务层
o
rH
Web层业务逻辑
e
t
s
e
T
e
m
持续集成
release包脚本
debug包脚本
行级覆盖率包脚本
函数级覆盖率包脚本
白名单机制
线上服务
模块2
模块1
模块3...
数据上传
o
H
r
运行时Lib
e
m
数据压缩
e
t
s
e
T
数据上传策略
数据dump策略
配置中心
Driver自动链接
LLVM Pass
实现插桩
App业务模块
覆盖率数据上报模块
打包脚本层
Clang编译器
云测平台
带有覆盖率的App程序
数据存
储服务
覆盖率数据合
并服务 覆盖率数据合
并服务
APLCov APLCov
线下服务
从伙伴平台拉取apln数据
从线上存储服务拉取合
并后的apda数据
日志输出
覆盖率数据收集模块
收集覆盖率SDK
探针实现lib
APLCov
e
t
s
e
T
genhtml
probe_lib 控制探针
o
rH
gitlab
Info文件
报告
蚂蚁金金金服
e
m
20. 自自研覆盖率技术方方案原理理图
.c .cpp .m .mm file
e
t
s
e
T
o
rH
e
m
覆盖率报告
compiler
插桩阶段
1
记录函数ID、文文件名、函
数名、行行行号
e
m
覆盖率数据解析阶段
LLVM
o
H
r
.apln file
AliapyInstrument插桩程序
分析程序指令并在相关
指令之间插入入桩点指令
e
t
s
e
T
4
APLCov
APLCov 根据hash值将apln文文件
和apda文文件合并,得到覆盖率数据
记录函数ID、执行行行
次数
.o file
.apda file
dump
linker
链接阶段
link
2
运行行行App阶段
覆盖率收集程序
App
3
e
t
s
e
T
记录执行行行函数的hash和次数
负责将覆盖率数据写入入磁盘
probe_lib
lib
App
得到可执行行行文文件
蚂蚁金金金服
o
rH
e
m
21. 性能指标对比比——用用Clang作为被测程序
插桩后产物体
积对比(单位
MB)
1000.0
e
t
s
e
T
913.0
o
rH
750.0
500.0
308.4
e
m
内存开销(单
位 MB)
执行时间(单
位 小时)
12.9
13.0
6.0
数据解析耗
时(单位
秒)
1200.0
覆盖率数据
文件大小
(单位 MB)
140.0
400.0
e
m
dump耗时(单
位s)
1071.0
5.26
4.91
4.5
9.8
3.0 6.5
1.5 3.3
e
t
s
e
T
6.6
7.1
6.7
o
H
r
326.1
300.0 105.0
600.0 200.0 70.0
300.0 100.0 35.0
900.0
323 311.9
250.0
0.93
0.42
0.0
0.0
未插桩
0.0
Gcov
Alipay行级
0.0
Alipay方法级
25.0
131.0
0.0
e
t
s
e
T
75.0
0.0
蚂蚁金金金服
o
rH
0.1
e
m
22. 自自研覆盖率方方案演示
e
t
s
e
T
o
rH
e
m
e
t
s
e
T
o
H
r
e
m
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
23. 真香香警告——自自研覆盖率带来了了什什么?
e
t
s
e
T
o
rH
e
m
吐槽声音少了,好评声多了
找我们排查问题的人少了
e
m
o
H
代码覆盖率也可以用来排查问题了
r
e
t
s
e
T
测试同学的负担轻了,工作效率高了
代码覆盖率的应用更广了
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
24. 技术红利利
业务方可以复用覆盖率方案
意义:极大降低业务开发成本
e
t
s
e
T
o
rH
monkey测试
提供了一种动态分析框架
意义:极大的降低了技术门槛,为动态分析的技术探索和创
新提供支撑。
e
m
热区分析
code_cover 覆盖率功能
精准回归
o
H
r
自动化埋点
e
t
s
e
T
probe_lib 提供探针的实现、保证线程安全
e
m
调用链路分析
伙伴平台可以打出带有这些探针的包
行级别插桩能力
函数级别插桩能力
拥有控制编译器读取、修改IR(中间代码)的能力
提供一种在IR代码上做
静态分析的手段
依赖分析、泄漏分析、crash
e
t
s
e
T
静态分析能力
蚂蚁金金金服
o
rH
e
m
25. 进化的覆盖率—总结
实时生成报告
统一插桩
e
t
s
e
T
o
rH
实时上传
多次数据合并
功能丰富
跨版本迁移
单机版覆盖率
覆盖率入门阶段
在单元测试中使用
推动的动力:
e
m
支持多人协作情
况下的覆盖率
覆盖率平台化
支撑质量红线
动态分析框架
数据解析
自动收集/上传
数据展示维
度的丰富
插桩
e
m
函数级覆盖率
实时代码覆盖率
e
t
s
e
T
多版本管理
o
H
r
5
自研覆盖率
基于覆盖率技
术提供一个创新
实验平台
提升monkey算法
方法执行耗时
依赖分析
调用链路分析
变更覆盖率
以版本设备为
维度展示数据
满足业务方提出的需求
效能提升
创新
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
26. 招聘广广告
支付宝终端工程技术部招人了
o
rH
App打包构建
e
t
s
e
T
App性能分析
e
m
App诊断分析
图像识别
自动化测试工具
e
t
s
e
T
H5、小程序、
浏览器内核
JAVA、算法、iOS、Android、前端,
都有岗位哦,职级目目前不不设上限的。
zhaishuai.zs@antfin.com
o
H
r
e
m
e
t
s
e
T
蚂蚁金金金服
o
rH
e
m
27. e
t
s
e
T
o
rH
e
m
e
t
s
e
T
o
H
r
e
m
e
t
s
e
T
o
rH
e
m