精准测试
2024-11-19 10:28:17 0 举报
AI智能生成
精准测试建设之路
作者其他创作
大纲/内容
平台架构设计
精准测试1.0
获取增量代码覆盖率
1、计算增量代码
1.1 通过JGit提供的diff方法
对比不同分支版本
对比不同commitId版本
1.2 入库记录当前差异数据
2、获取增量代码覆盖率
通过改造Jacoco,在执行jacoco report的时候通过匹配增量代码来生成
3、如何合并多次测试结果的覆盖率?
踩坑经历
3.1 服务每次重启后,jacoco-agent保留的覆盖率数据都会被清零
3.2 由于在测试过程中,我们会多次更新测试环境,而且还存在插入hotfix,切换分支的情况;
3.3 多个exec数据合并问题&&Jacoco merge的处理逻辑
由于Jacoco merge是针对classid级别,所以在使用合并过程中会存在覆盖率丢失的情况
解决方案
针对3.1,每次更新前需要将当前的覆盖率dump下来进行保存
针对3.2,dump下来的exec文件需要按照构建分支进行保存
针对3.3,建议通过用代码根据每次exec生成的html结果进行比对处理,合并最真实的覆盖率结果。如python的bs4
Jacoco
覆盖率的意义
1、分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点
2、检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒设计/开发人员理清代码逻辑关系,提升代码质量。
3、代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试自我审视的重要工具之一。
工作流程
1、对 Java 字节码进行插桩,On-The-Fly 和 Offine 两种方式
On-The-Fly
1、代理模式,无需修改源代码
2、不停机获取覆盖率
Offine
1、不需要代理,但需要修改源码
2、停机获取覆盖率
两者比较
On-The-Fly 模式更加方便的获取代码覆盖率,无需提前进行字节码插桩,可以实时获取代码覆盖率信息
Offline 模式适用于以下场景
部署环境不允许设置 JVM 参数
字节码需要被转换成其他虚拟机字节码,如 Android Dalvik VM
动态修改字节码过程中和其他 agent 冲突
无法自定义用户加载类
2、执行测试用例,收集程序执行轨迹信息,将其 dump 到内存
3、数据处理器结合程序执行轨迹信息和代码结构信息分析生成代码覆盖率报告。
4、将代码覆盖率报告图形化展示出来,如 html、xml 等文件格式
名词解释
javaagent: 指定 jacocoagent 的路径
includes: 表示只对指定包下的类进行覆盖率注入分析,默认为 *,示例中只分析 com.test 包的类。
output: 表示覆盖率的输出方式。在 tcpserver 模式下,Jacoco 会在客户端执行 dump 操作时将目前收集获取到的覆盖率数据统一写到指定的ip和端口。在 file 模式下,Jacoco 只会在JVM 终止的时候才将收集到的覆盖率数据写入到指定的 exec 文件里去。注意,不管是任何模式,应用运行过程中的临时覆盖率数据都是保存在服务端的内存中的,因此对于 tcpserver 模式来说,如果 JVM 不小心终止了,那么在这个覆盖率统计周期内的覆盖率数据都会丢失。
address: 只限 tcpserver 与 tcpclient 使用,表示监听的应用服务器IP地址或主机名。可根据实际情况自由选
port: 只限 tcpserver 与 tcpclient 使用,表示监听的应用服务器的端口号,一般用默认6300即可
append: 表示覆盖率数据的追加方式,默认为true。客户端在执行 dump 操作时,如果该 exec 覆盖率文件已存在,那么该轮的覆盖率数据会直接在文本末尾进行追加,因此会导致覆盖率数据文件越来越大。如果改为false,则客户端执行 dump 操作时会直接清空原覆盖率文件的内容,保证该覆盖率文件只有该轮的覆盖率数据
实战部署
方法一
配置环境变量
export JACOCO="-javaagent:/$your_path/jacocoagent.jar=includes=com.grgbanking.*,output=tcpserver,address=11.111.1.11,port=6300,append=true"
export JAVA_OPTS="$JACOCO":"$JAVA_OPTS"
获取覆盖率文件
java -jar jacococli.jar dump --address 11.111.1.11 --port 6300 --destfile /opt/jacoco.exec
生成覆盖率报告
java -jar jacococli.jar
# 指定报告数据文件的路径
report /opt/jacoco.exec
# 指定项目编译后的 class 文件路径
--classfiles /workspace/some-project/target/some-project/WEB-INF/classes
# 指定生成 HTML 报告路径
--html /opt
#指定源码路径(如果不指定无只能看到类和方法的覆盖率,没办法看到具体业务逻辑的服务概率)
--sourcefiles /workspace/some-project/src/main/java
# 指定编码方式
--encoding utf-8
# 指定报告名称
--name some-project
# 指定报告数据文件的路径
report /opt/jacoco.exec
# 指定项目编译后的 class 文件路径
--classfiles /workspace/some-project/target/some-project/WEB-INF/classes
# 指定生成 HTML 报告路径
--html /opt
#指定源码路径(如果不指定无只能看到类和方法的覆盖率,没办法看到具体业务逻辑的服务概率)
--sourcefiles /workspace/some-project/src/main/java
# 指定编码方式
--encoding utf-8
# 指定报告名称
--name some-project
方法二
精准测试2.0
获取调用链路
1、应用内部调用链路
1.1 通过Javasparer和asm以分析内部调用链
1. 获取所有接口实现类
2. 接口与实现类桥接
获取接口与接口实现类的关系
3. 内部类与外部方法桥接
3.1 生成方法调用关系
3.2 过滤调用第三方包,jdk的api,get(),set()
3.3 扫描每个方法的invoke指令
1.2 通过结合增量代码,获取受影响的对外模块(接口,定时器,消息队列等)
2、应用外部调用链路
2.1 如果已经接入bpm工具,每个请求都能拿到traceId
1. 如果直接对接bpm工具能拿到全链路调用关系,则对接记录入库即可
2. 如果拿不到,则自己通过traceId对日志进行清洗,得出全局调用链路
2.2 如果没有traceId,推动技术团队接入bpm开源工具
zipkin
skywalking
pinpoint
精准测试3.0
1、CI/CD进行封装
1、 每次构建应用后,可以得出的数据
本次改动对比线上受影响的接口,区分新增和修改
受影响的【修改】类型接口,需要展示出涉及关联的调用方,区分上下游
2、测试完成后可以查看总体覆盖率情况
支持查看具体代码的覆盖情况
2、接口自动化平台对接
匹配用例库
显示本次受影响的接口case
匹配失败则通知测试人员完善用例库
匹配准确率
如何解决匹配过多冗余case的情况?
精准测试4.0
个人测试覆盖率
如何统计不同测试人员的覆盖率情况?
......未完待续
0 条评论
下一页