用javaparser做精准测试

文章目录

简介

javaparser 用于构造 java 抽象语法树 AST,可以依赖 .java 源代码文件进行静态代码分析,通过解析 AST,来找到方法的调用链

这里已经做好 Javaparser 精准测试项目,发布于 github,MIT 协议

此项目使用 java 静态代码分析(底层使用 javaparser 能力),分析 .java 文件,从指定方法入口开始,找到项目中方法的层层调用链路

为啥做精准分析

每次开发迭代,往往有时候会影响历史的某些接口,但无法分析准确的评估具体影响哪些接口,实际生产中往往靠人对业务的理解和记忆,来粗估影响范围,但是这一切不够"精准",因此需要一些工具来做精准分析

复制代码
[读取源代码文件或字节码文件]
=>
[javaparser,ASM 等工具解析方法调用链找到项目最上层接口]
=>
[使用一些 trace 工具所记录的调用关系,拿到 http 接口]
=>
[通过 http 找到业务场景和用例进行回归测试]

效果展示

可打印出方法调用链路:

复制代码
Level1#level1_func8(String, int)
    ├── Level2#Level2()
    └── Level2#level2_func8()
        ├── Level3#Level3()
        ├── PrintStream#println(String)
        └── Level3#level3_func8(boolean)
            └── StringUtils#isBlank(null)

Javaparser?ASM?

建议:对于 java 项目,如果只能拿到 .java 文件无法拿到 .class 文件,解析方法调用链可以使用 javaparser 来解析。而若能拿到 .class 字节码文件,那么可以使用 ASM 来解析方法调用链

专门分析 .java 源代码文件的 javaparser 可以解析 AST 出来,但是由于纯 java 代码是静态代码,没有动态信息,纯文本内容很难猜测分析出多态场景,以及目前 lambda 表达式的识别能力有限,并且对于第三方依赖,是不能很好的分析的,除非第三方的依赖的 .java 文件都被下载下来,添加进入符号解析路径中去(但不可能把所有的第三方依赖的源码文件都下载下来)

相比,ASM 专门用来分析 .class 字节码文件,可以分析的更深,但是操作起来难度也更大

【javaparser 和 ASM】

一般企业在做精准测试时,往往会使用 javaparser 结合 ASM 做方法调用链分析。由于 javaparser 做静态代码分析解析的是 .java 文件来构造 AST,而 ASM 则是解析 .class 文件来进行方法调用链分析,其实相比 javaparser 而言,ASM 要解析的更完整一些,且性能更好,但是 ASM 更偏低层能力,用户用起来更麻烦

【不好解析的地方】

相比 ASM,其实 javaparser 很多场景不太好解析:

  • lambda 表达式的场景:javaparser 解析的很有限
  • 多态场景:由于 javaparser 做静态代码分析,而多态在运行时确定,所以 javaparser 无法真正的解析多态场景,可能只能通过 coding 来定一些规则来猜测
  • 第三方依赖:项目中往往有很多第三方依赖,如果引入真实的这些依赖的 .java 文件的路径,那么这些依赖对应的类也无法解析的完整
  • ...

【性能上】
ASM 其实性能要更好,不管是解析速度还是内存占用上

【易用性上】

相比 ASMjavaparser 无疑占优

项目: Javaparser 精准测试项目

功能描述:

此项目使用 java 静态代码分析(底层使用 javaparser 能力),分析 .java 文件,从指定方法入口开始,找到项目中方法的层层调用链路

项目中从入口方法开始往下解析,找到层层方法调用链路,最终构造出 Dag 结构

已经考虑到:

  • 方法节点复用
  • 循环调用
  • 双向遍历
  • 多态场景等问题

具体介绍可参照:

项目 README.md

相关推荐
古法安卓2 小时前
Android-日志系统源码解析
android·java·android studio
小夏coding3 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
MacroZheng4 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
十年Java程序媛5 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
xiaoqiMikko5 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat
用户3126874877209 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang9 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing9 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活10 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
lhldsg11 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售