AI测试 精准测试 ------- 函数调用链关系研究

heygrl · 2018年11月08日 · 最后由 测试新人 回复于 2024年02月22日 · 6744 次阅读

目标:能够通过一段修改过的代码,能推断出测试要回归哪些用例
难点:函数间的调用链关系,代码与用例的对应
大家有研究过的没,求给个思路

共收到 16 条回复 时间 点赞

那要看被测应用开发语言特性了,java 可以使用 sonarqube 分析
研究过一段时间,基本功不扎实,搁置了……

heygrl #15 · 2018年11月08日 Author
槽神 回复

我们是 Android 客户端代码,那应该也可以用

腾讯有同学研究出来了,只不过没对外公布过

分析函数调用链有几种经典的做法

  • 语法树分析
  • 编译器数据
  • 运行时插桩或 hook

对应的工具可以看看 asm jacoco 即可。本质上是对覆盖率数据和测试用例进行建模。覆盖率一直依赖被误用为纯数字,其实覆盖率是一个庞大的树结构数据,每个叶子节点与用例之间存在关联关系。根据函数调用关系细化集成测试用例与覆盖率是有很大的价值的。
用好 asm jacoco 等类似工具的覆盖率统计工具是第一步,分析收集的函数调用链数据并建模分析是第二步,第三步做平台 show 出来,或者集成到以后的大数据平台。

上次看性能组同事的用一个工具,查看调用链,没有记住啥工具。。。。

感觉第二部就是难点,目前没有现成的可行工具可以拿来直接用么,自己从头开始做有点难度,没搞过算法

hello 回复

我们目前也试用了几个,不过都不好用,要么很慢,要么死循环了

不知楼主是否看过《不测的秘密—精准测试之路》这本书,你上面引用的文章就是其中一篇

Java 函数调用链分析,一般会通过静态分析和动态分析两种方法,静态分析的话主要手段是字节码分析了(看 JVM 方法调用 5 个指令的解析),动态就是字节码插桩或者通过 apm 工具也可以拿到。

静态主要解决的是新增代码的场景,缺点是由于 Java 语言的一些运行时绑定特性会导致分析的不够精确(静态语言就比较准确了)。
动态就是比较准确了,但是解决不了新增代码这种情况

另外你说的 代码跟用例的关系,不清楚是接口的用例还是功能层面的用例,如果接口层面,通过调用链关系可以匹配到,如果是功能层面,客户端代码还是可以记录下来的,如果服务端代码就难了

调用链分析可以结合增量代码覆盖率做针对性的用例覆盖,同时可以变更影响范围评估

ps: 这个问题算不上 AI 测试领域吧

以前也试过用 org.eclipse.jdt 包来分析 Java 的 AST 语法树,无奈功力不够深厚,也没做下去。。

workhard 回复

我反倒觉得精准测试的未来就靠机器学习甚至 AI 了😂
https://testerhome.com/topics/10700

arrow 回复

分析字节码更好,因为 kotlin scala 什么的也会编译为字节码,这样更精准。动态测试只有覆盖率技术,也是基于字节码插桩

刚好在腾讯里参与这块的研究。
先说结论,我们这边是 jdt 里的 astparser 做的调用链解析,目前除了反射搞不定,基本够用了。精准测试平台也已经跑起来几个了。
但就像思寒说的,我也推荐基于 asm 分析字节码更好,虽然要编译一次,但这样简单容易上手,研究 jdt 还是要花一些时间的。

还以为我们是首创这种方案呢😂 ,没想到 18 年就有了,javaparser 看来是主流方案😂 😂 😂

java + kotlin 调用链有小伙伴有方案吗?

原来很久以前你们就在讨论了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册