用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

相关推荐
小bo波3 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯5 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
SamDeepThinking15 小时前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好16 小时前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng17 小时前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking17 小时前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
Flittly1 天前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了1 天前
Java 生成二维码解决方案
java·后端
人活一口气2 天前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP2 天前
Vibe Coding -- 完整项目案例实操
java