用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

相关推荐
叶小鸡3 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan3 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_180079054733 小时前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路4 小时前
C++23概述
java·c++·c++23
专注API从业者4 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠5 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY5 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克36 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信