Code Review Graph 怎么辅助审查:从一次函数修改找调用者和测试

用三个 Python 文件实测 Code Review Graph 的构建、改动分析和影响查询,解释测试关系、旧索引、token 统计与审查记录应怎样核对。

把应用部署到土耳其|BRNCHOST · 土耳其 VDS
云服务器,积分可续期|雨云 · 国内外节点 · 积分兑换权益
低价年付,大流量 VPS|RackNerd · SSD 存储 · 1Gbps 端口
香港轻量,搭个小站|晚安云 · 香港云服务器
香港 VPS,大带宽可选|野草云 · BGP 直连
大陆访问,精品线路|搬瓦工 · CN2 GIA / CTGNet 套餐
资料归档,交给 AI 整理|WorkBuddy · 本地文件处理
建站起步,先看应用镜像|腾讯云 · 轻量应用服务器
CN2 GIA,中国方向优化|DMIT · Premium 网络
双 ISP 原生住宅 IP|丽萨主机 · 美国 9929 精品线路
高频 CPU,多地部署|Evoxt · 云服务器 · 每周异地备份
京东云轻量云主机:129元/年,新人专享,限购1台

改一个计价函数,只看它自己的 diff 往往不够。调用方是否接受新的异常?旧测试有没有覆盖新增分支?如果项目有几百个文件,审查者需要先找出值得一起读的那几处代码。

Code Review Graph 会解析仓库中的符号与关系,保存一份可查询的图谱。你可以从改动出发,查函数调用、相关文件和测试线索,再回到源码判断行为。本文以 2026 年 9 月 23 日查阅的官方资料和一个本地小实验说明用法,不把项目展示的 token 节省比例当作实际项目的承诺。项目仓库

先看它能替审查者找什么

普通文本搜索能找到函数名出现的位置,但同名函数、导入别名和注释会混在结果里。图谱尝试把文件、函数、类及其关系组织起来,让查询带上“谁调用谁”“哪个测试引用它”这些信息。

这对跨文件修改有帮助。例如底层函数开始抛出异常,调用者没有改动,所以不会出现在本次 diff 中;沿调用关系查找,可以把它带回审查范围。审查者随后检查异常是否向用户泄漏、是否造成事务中断,或者是否已有统一处理。

代码审查图谱与相关上下文示意

不过,图上的连线只表示工具解析出的关系。动态导入、运行时注册、框架约定和配置文件中的依赖,未必都能完整反映。查询结果适合作为阅读路线,不能据此认定其他文件一定不受影响。

用三个 Python 文件验证最小流程

本次验证在 macOS 的 arm64 环境、Python 3.12.14 下进行,使用隔离环境中的 code-review-graph==2.3.9。测试没有注册全局 MCP,也没有接入云端嵌入服务。

仓库只有三个文件。pricing.py 定义计价函数:

def total(price, quantity):
    return price * quantity

checkout.py 调用它生成结果:

from pricing import total

def checkout(price, quantity):
    return {"amount": total(price, quantity)}

test_pricing.py 包含一个现有测试:

from pricing import total

def test_total():
    assert total(12, 3) == 36

把这三个文件提交到一个独立 Git 仓库,然后从仓库根目录建立图谱:

code-review-graph build --repo .

本次构建报告解析了 3 个文件,得到 6 个节点、8 条边。这个结果只说明小样本解析成功,没有测量大型仓库的构建速度。

接着修改 total,在乘法前增加数量检查:

def total(price, quantity):
    if quantity < 0:
        raise ValueError("quantity must be nonnegative")
    return price * quantity

此时改动留在工作区,Git 的 HEAD 仍是最初的三个文件。运行:

code-review-graph detect-changes --repo . --base HEAD
code-review-graph impact --repo . --files pricing.py

第一条识别出 total 的修改,并列出从 checkout 到 total 的受影响流程;第二条结果包含 checkout.py,还展示了与 test_total 的测试关系。这正是审查时需要补读的上下文。

“找到测试”与“测试了新行为”有多远

这次输出里的 test gap 数量是零,但现有测试只计算了正数数量。它没有检查负数是否抛出异常,也没有验证调用方怎样处理异常。因此,审查者仍然需要提出两个具体问题。

首先,负数在业务上究竟表示非法输入,还是退货数量?如果系统原来允许负数来冲减金额,新增检查可能破坏已有流程。这个答案要查业务规则和真实调用,单凭函数名无法确定。

其次,如果负数确实非法,检查应该放在哪一层?底层函数抛错以后,接口是否返回合适的状态和提示?批量结算会不会因此整批中止?测试应跟着这些预期补充,而不只是断言“抛出了某个异常”。

图谱帮我们找到了测试文件,却没有替我们评价断言是否充分。把这两件事分开,才能避免看到绿色或零缺口就提前结束审查。

图谱的更新时间要与阅读目标一致

detect-changes 在该版本中读取现有图谱,不会重新解析文件。这次输出仍展示了原先函数的行号范围,虽然工作区里已经增加了几行。沿结果跳转时,应以当前源码为准。

如果希望图谱反映新结构,需要使用增量更新或重新构建。尤其在重命名、移动文件、删除函数之后,旧索引可能把人带到已经失效的位置。官方命令文档区分了构建、增量更新和查询用途,接入编辑器前值得先读这一部分。命令说明

可以为团队约定两个时点:审查前确认比较基线与索引状态,修改完成后更新图谱。比较分支时,还要理解工具采用的 Git 基线,避免把别人的提交混进本次影响范围。输出显示的改动数量与 git diff 明显不符时,先查基线,不要继续解释风险分数。

token 节省比例应该怎样看

“把全仓库塞给模型”与“只取少量相关节点”相比,后者当然可能短很多。但真实工作中,开发者可能原本就用搜索、语言服务器和手工选择文件。换一个基线,节省比例就会改变。

项目的复现说明列出了不同比较口径,包括整库上下文、搜索结果以及多次工具调用。阅读结果时至少核对仓库、任务、返回数量和计算方式。不能把一个大仓库上的比例搬到只有几个文件的小项目里。基准复现说明

本次小实验报告的估算节省比例是零。它仍然找到了有用的调用关系,说明“少读了多少 token”与“是否找到审查线索”需要分别评估。更有用的团队指标可以是遗漏调用方的次数、审查者找到依据所需的时间,以及最终发现的问题是否真实。

把查询结果写成一份可复核的审查记录

可以把本次例子的审查记录分成三段。第一段说明修改:数量小于零时,计价函数新增异常。第二段列出证据:调用位置在结算模块,现有测试只覆盖正常乘法。第三段列出待确认事项:退货是否允许负数、接口层如何处理,以及需要补充哪些测试。

记录中保留提交标识与源码位置,比只保存一次聊天结果更方便复查。后续代码移动了,审查者仍能回到当时的版本。若模型提出一个问题,却找不到对应调用或行为变化,就应先核实,不把它直接转成阻塞合并的缺陷。

对自动化接入,可以先让工具生成待阅读文件清单,由开发者选取必要片段。等几次回放确认范围合适,再让模型补充审查建议。一次返回过多节点时,优先围绕本次行为变化缩小问题,例如只查新增异常的调用路径,而不要求模型评价整个模块。

团队也应保留工具遗漏的例子。框架通过字符串注册处理函数时,文本搜索可能比调用图更有效;数据库字段名改变时,还要搜索迁移与查询。把这些补充步骤写进项目审查说明,能让下一位使用者知道何时需要换一种查法。

接入日常工作前,拿旧修改做一次回放

选择几笔已经知道影响范围的历史提交:一个普通函数修改、一次跨文件重命名,以及一个依赖框架注册的修改。先自己列出应检查的调用者和测试,再看工具返回什么。

把缺失结果分成两类。若源码关系本身能解析却未出现,检查语言支持、忽略规则和索引状态;若依赖来自运行时配置,则需要补充配置搜索、集成测试或人工说明。不要通过扩大返回数量掩盖关系提取的问题。

还要检查返回内容是否过长。包含几十个间接调用者的输出,可能让模型忽略真正关键的入口。限制深度和结果数后,保留被截断的提示,让审查者知道仍有未展开的部分。

默认的本地图谱与可选嵌入功能也应分别评估。启用云端提供商之前,要确认会发送哪些源码衍生内容、使用哪个账号,以及是否产生调用费用。先用普通构建与查询判断价值,没有必要为了试用一次就打开所有功能。

当工具能把一次改动带回具体的调用位置、相关测试和可核对的代码行时,它就有了明确用途。最终审查意见仍应写出行为变化与证据,例如“新增异常会从结算入口向上传播,当前只测试正数数量”,而不是引用一个风险分数代替判断。