一行代码改完,你盯着 diff 看了三秒:这玩意儿还会影响什么?这个问题不好回答。diff 只告诉你改了什么,不会告诉你哪些函数在调用它,也不会告诉你哪些测试可能跟着遭殃。
![]()
有人干脆把它做成了工具。IMPACT,一个 Python 的 PR 审查工具,作者用它参加了 WeMakeDevs 和 FalkorDB 的 Graph Hacks 活动。思路很直接:把代码之间的调用关系存进 FalkorDB,再顺着这些关系走一遍,生成一张能点开看的图。
先拿一个小仓库开刀
作者没有一上来就啃大项目,而是找了个小的结账仓库。里面有定价、购物车、结账、收据,还有几个测试——刚好够让一处改动穿过好几个文件。
然后他故意把优惠券计算改坏了。改之前是取小计和优惠券金额中的较小值,改之后直接等于优惠券金额。结果很直观:一张 30 美元的券用在 20 美元的购物车上,总价变成负数。收据测试期望 0,拿到的是 -1000;结账测试直接抛错,因为它拒绝向用户收取负数金额;而正常优惠券的测试照样通过。
一行改动,三种结局。作者想要的是:让 IMPACT 从代码关系里把这些测试找出来,并且说清楚为什么挑中它们。图负责选出相关测试,测试运行器负责记录真实结果。
顺着调用关系往回走
IMPACT 把文件和函数存进 FalkorDB,只要一个函数调用了另一个函数,就记一条 CALLS 连接。在演示里,结账流程最终会经由购物车和定价代码,走到被改动的 apply_coupon 函数。
apply_coupon 一变,IMPACT 就沿着这些连接反向遍历。它找到七个可达的调用方,其中三个是测试。有一条测试路径长达四次调用——这种东西光看 diff 是看不出来的。
背后是一条 Cypher 查询,从调用方出发,沿着 CALLS 关系走 1 到 4 跳,找到被改动的函数,返回调用方 id、是否为测试、路径长度和路径上的节点。HTML 报告用的也是这些路径:点开一个测试,就能顺着连接一路追回被改的代码。
过程并不顺。作者一开始卡在连不上 FalkorDB,后来又得修一条最短路径查询,改成 FalkorDB 能接受的语法。现在跑审查之前,doctor 命令会先检查连接和图查询。
该找谁来看这段代码
演示里还多问了一个问题:谁熟悉这块代码,它当初为什么这么写?
为此作者造了一份小型的虚构公司数据集,把一个代码文件连到它的负责人、她所在的团队,以及三条来源记录:一条关于优惠券上限的决策、一张关于负数扣款的客服工单、一段团队聊天。IMPACT 把这些连接和调用图一起放进 FalkorDB。问它 apply_coupon 的事,它会建议 Maya Chen 作为审查人,并指出这个建议背后的记录。
同样的上下文也会出现在 HTML 报告里,就在测试路径旁边。作者说得很清楚:这只是个想法演示,人和文档都是合成的,还没有接进真实公司的 Slack 或工单系统。
AI 那部分是可选的
作者起初以为,黑客松里的 AI agent 非得是个聊天机器人不可。做下来发现,对 IMPACT 有用的动作其实是决定看什么、先跑哪个测试。
AI 这一步可以跳过。模型调用一个 FalkorDB 工具,查看受影响的代码,挑一个测试优先检查。IMPACT 会验证这个选择确实和改动有连接,然后由测试运行器给出真实的通过、失败或报错结果。不填 AI API key,图分析和测试选择照样能跑。
放到真实 PR 上试试
坏掉的结账演示够用,但作者还想看看 IMPACT 对一个修复会怎么说。他把结账代码放进另一个示例仓库,开了一个给超大优惠券加上限的 PR。
IMPACT 从图里挑出三个测试,在两个提交上分别跑。两个在基线提交上失败、在 PR 上通过;正常优惠券那个测试两边都通过。这比一份“该跑哪些测试”的清单信息量大:能看出这次改动到底修没修好它该修的那些情况。
接着他把同一套审查搬进了 GitHub Actions。一个 Python PR 会启动临时的 FalkorDB 实例,生成图和报告,对比测试结果,然后更新 PR 上的评论。这个流程不需要 AI key,图和测试结果就够了。
他还拿一个更大的 HTTPie PR 试了试。IMPACT 找到 18 个测试目标,展开成 43 个用例:34 个通过,9 个依赖远程服务的用例被跳过,没有失败。小结账例子适合讲清思路,这个例子让他看到了代码量大得多的时候报告长什么样。
作者也交代了局限:解析器目前还是静态 Python 分析,动态调用和运行时导入可能被漏掉,所以一条调用路径只代表可能的影响。他打算继续在不同仓库上试,把覆盖不到的地方补上。
IMPACT 报名了两个赛道:一个顺着代码图帮人审查改动,另一个把代码背后的人和决策也连进来。对天天审 Python PR 的人来说,能看到通往某个建议测试的路径,还能看到当初那个决定的原因,确实比只给一份测试清单要有用。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.