浏览 AI使用教程
怎样让 AI 做代码审查:先找 Bug、回归和缺测试
让 AI 做代码审查时,先要求它找会改变行为的 Bug、回归风险和缺失测试。命名与格式可以最后看,不能让它们淹没权限或数据问题。
按实际操作顺序推进
每完成一段就检查当前输出,确认结果符合预期后再继续。
审查列了十条风格建议,却漏掉退款接口的权限漏洞
代码审查结果列了变量命名、空行和注释风格,却没发现退款接口缺少权限校验。漂亮的建议不等于有效审查。
- 发现指向具体文件与行为
- 严重度与影响相称
- 缺失测试和回归风险已覆盖
动手前,把材料和不能改的部分定下来
| 需要确认 | 本例内容 |
|---|---|
| 现有材料 | PR 修改退款路由、服务和测试;需求要求仅财务角色可退款,且重复请求不能重复退款。 |
| 不能越过的边界 | 先找正确性、安全、回归和缺测试;每条发现给文件位置、触发条件和影响;不把纯偏好当 Bug。 |
| 要交付的结果 | 按严重度排序的审查清单 |
AI 代码审查提示词,从“理解变更意图”开始做
理解变更意图
读取 issue、PR 说明、规则和 diff,确认旧行为、目标行为和范围外,不从单个文件猜全局。
沿关键路径检查
追输入、权限、状态、错误、数据写入和外部副作用,关注边界和失败路径。
验证兼容与迁移
检查接口、配置、数据库、缓存、客户端和回滚是否同步,寻找单点改动引发的不一致。
检查测试是否有效
测试应能在旧错误下失败,覆盖高风险分支;只增加覆盖率但无断言不算。
按严重度写发现
先给位置和结论,再给触发、影响与修复方向;不确定项标问题,不宣称已证实。
发现必须有触发依据
api/refund.mjs 教学diff
给定authenticate只保证已登录
+ app.post('/refunds', authenticate, async (req,res) => {
+ const result = await refundService.create(req.body.orderId);
+ res.json(result);
+ });
已知:authenticate允许所有已登录角色;create不接收调用者。
需求:仅finance角色可退款。
触发:role=member提交一项可见订单ID。
预期:拒绝且create调用次数为0。
当前片段:会继续调用create;仅在隔离测试中验证,不操作真实订单。确定缺陷与开放问题分开
| 级别 | 证据 | 影响 | 下一步 |
|---|---|---|---|
| P1 | authenticate后直接create,无finance校验 | member可调用退款 | 补finance允许、member拒绝且零副作用断言 |
| 待确认 | 路由没有幂等参数 | 尚不能确定服务内部是否去重 | 追数据库约束与供应商幂等记录 |
| 测试缺口 | 需读取真实测试文件 | 只测成功可能漏权限 | 确认后才列缺测发现 |
让 AI 做代码审查时,先找 Bug、回归和缺测试
适合提供真实diff和上下文文件后使用,不让AI只评价命名和格式。
可复制使用
让 AI 做代码审查时,先找 Bug、回归和缺测试
请只审查我这次提供的代码 diff,优先找会导致错误行为、数据损坏、安全边界破坏或兼容回归的问题。 任务目标/不允许改变的行为【】;完整 diff【】;必要调用方与相关测试【】;已运行命令及原始输出【】。 每个发现都要给严重度、文件和行、具体触发条件、实际影响及最小修复方向。没有可复现证据的担忧放入“待核查”,不要包装成缺陷。最后单列漏测风险。不要评论纯风格偏好,不扩展到 diff 之外的重构。
使用范围:适合提供真实diff和上下文文件后使用,不让AI只评价命名和格式。不要把个人风格偏好写成Bug,不扩大到无关重构。
完成后的按严重度排序的审查清单
给定条件支持确认非财务登录用户仍会调用退款服务。片段未出现幂等键只能列待确认,追服务与存储后才能断言未实现;不能因路由片段没有代码而推断整个系统。
为什么“发现很多潜在问题,作者无法判断优先级”还不能交付
发现很多潜在问题,作者无法判断优先级
- 原因
- 没有区分可触发缺陷与猜测
- 怎么改
- 按严重度、发生条件和证据排序,无法证实的内容写成问题而非结论
