生活分享

测试、Code Review 与 PR

测试确认程式在指定条件的行为,Code Review 检查变更是否有遗漏或风险,PR 则让人查看并讨论要合并的差异。三者互补;通过测试不等于审查通过,开 PR 也不是已合并。

阅读时间约 15 分钟 · 操作 30 分钟

实作顺序示意图,非产品介面截图。
图片:Mokaair (© Mokaair)
回总目录:Codex 学习中心:完整教程目录

实践 · Desktop / CLI / VS Code / JetBrains / cloud

本篇目录
  1. 目标与准备
  2. 步骤 1:建立故意有问题的提案
  3. 步骤 2:选对 Review 范围
  4. 步骤 3:补测试并移除错误提案
  5. 步骤 4:整理可审阅的提交与 PR 草稿
  6. 让测试纪录对应到最后版本
  7. 常见问题、还原与验收

目标与准备

本段提到的教学与资源:

测试回答已写出的案例是否符合期待,Review 检查修改是否带来遗漏的风险与行为差异,PR 则让指定分支的成果可以被其他人审阅。三者不能互相代替;没有发现问题不是证明不可能有问题,PR 已开启也不表示已合并、部署或公开。这次会让你亲自看见测试覆盖范围的空缺。

步骤 1:建立故意有问题的提案

建立新的 codex-review-lab,复制 expected 的五个档案,依 Git 篇用本机练习身分初始化 main 并提交五档基准。确认工作目录干净后执行下面命令建立分支。不要使用刚才仍有未完成变更的库;在新的副本操作才能判断本次差异来自哪里。

终端机:Review 分支与基准 · sh
git switch -c codex/review-lab
node --test core.test.mjs

原测试应 3 项全过。现在只在 core.mjs 的 visibleTasks 最后一行,把 return tasks; 改成 return tasks.reverse();,不要改其他函式。再跑同一测试,仍应全过,因为既有筛选案例只断言 Active 与 Completed,没有直接检查 All 的顺序。这是故意制造的待审修改,还不能提交或当成功功能使用。

终端机:观察原测试的缺口 · sh
git diff -- core.mjs
node --test core.test.mjs

步骤 2:选对 Review 范围

桌面版开启本 Git 专案,先在 Review 面板选 Unstaged,确认看到刚改的 core.mjs,再于 Codex 输入框使用 /review,核对所选差异。CLI 先从 codex-review-lab 的系统终端机执行 codex,确认工作目录后,在互动输入框使用 /review,选 Review uncommitted changes;不要把 /review 打在系统 shell。此处还没 commit,只审某个已提交版本会漏掉 reverse。入口与范围依官方 Code review 文件核对。

桌面版另有 Staged、Commit、Branch、Last turn,不能把 Last turn 当整个分支。CLI 的未提交审查包含已暂存、未暂存与未追踪内容,范围比单看 git diff 更广。Review 面板也可能呈现你或其他任务留下的改动;多 repository 时先核对选取的库。若同一档案既有 staged 又有 unstaged,依分别查看,再说明这次要审哪部分。

把「All 必须保留原顺序且不能修改输入」作为补充审查条件。预期的有效发现要指出目前那行 reverse、触发条件是 All/预设分支、影响是反转顺序且原地改阵列,以及哪些测试没涵盖。只有「程式码品质可改善」没有位置和具体后果,不是本例可采取行动的发现。

Codex 提示词:唯读 Review · text
Review the uncommitted change only. All must preserve task order and must not mutate the input array. Existing tests pass, so inspect their coverage rather than treating that as proof.
For each finding, state the file/line, trigger, concrete impact and a verification case. Do not edit, stage, commit or push during this review. If you find no issue, report what you examined and any uncertainty.

如果代理没指出问题,不要把它的结论当唯一验收;亲自读 reverse 的用法,接著用下面测试确认。若代理提出错误发现,也不要直接照改,要求能重现的输入与结果。Review 的责任是提供可核对的证据;真正修改要在理解并同意修正后另行交付,保留原始问题与最后差异之间的对照。

步骤 3:补测试并移除错误提案

将下列内容新增为 review.test.mjs。第一项检查 All 的原始顺序,第二项用冻结阵列检查不应尝试原地修改。先在错误版执行两个档案,预期原三项通过、新两项失败;不要跳过这一步,否则不知道新测试是否真能挡住这种改动。

新增档案:review.test.mjs · javascript
import test from "node:test";
import assert from "node:assert/strict";
import { visibleTasks } from "./core.mjs";

const makeTasks = () => [
  { id: "a", title: "Read", completed: true },
  { id: "b", title: "Build", completed: false },
];

test("All preserves original order", () => {
  assert.deepEqual(visibleTasks(makeTasks(), "all").map((task) => task.id), ["a", "b"]);
});

test("All does not attempt to mutate the input array", () => {
  const tasks = Object.freeze(makeTasks());
  assert.doesNotThrow(() => visibleTasks(tasks, "all"));
});
终端机:执行完整回归 · sh
node --test core.test.mjs review.test.mjs

接著只把 visibleTasks 最后一行恢复为 return tasks;,保留新测试,再跑应 5 项全过。检查 git diff:core.mjs 应已回到 main 基准,最终要交付的只有新增 review.test.mjs。这次 Review 阻止了错误实作进入提交,同时留下之前缺少的保护;PR 要描述最终的测试补强,不能宣称程式码仍有不存在的修正。

步骤 4:整理可审阅的提交与 PR 草稿

只暂存新测试,先看清单与内容再提交。接著用 branch diff 核对 main 到本分支只有 review.test.mjs,检查命令结果是这个最终版本。若又修改档案,先重跑受影响测试,不能引用较早版本的全过记录。下面 PR 文字中的结果只在你真的执行后才能保留。

终端机:提交最终测试差异 · sh
git add review.test.mjs
git diff --cached --name-only
git diff --cached -- review.test.mjs
git commit -m "Test All filter order and input preservation"
git diff --stat main...HEAD
git status --short
文件范本:PR 标题与说明 · markdown
Title: Add regression coverage for All filter ordering and input preservation

The existing filter tests cover Active and Completed but miss All ordering and input mutation. Add two focused cases so a reversing implementation is rejected. Production code is unchanged.

Validation: node --test core.test.mjs review.test.mjs — 5 passed, if actually run.
The deliberate reverse variant fails both new tests.
Browser checks: NOT RUN in this test-only change unless separately verified.
Deployment: not performed.

这时本机交付已具体可审,还没有 GitHub PR。若要练习外部 PR,在自己的 GitHub 建立空白练习库,不预先加入 README,复制它实际显示的远端网址,再把下面第一行的占位符换成该网址后执行。先核对 remote -v 确实是自己的新库;后面两次 push 会把本机基准与测试分支传到 GitHub。

终端机范本:先替换远端网址再推送 · text
git remote add origin YOUR_REPOSITORY_URL
git remote -v
git push -u origin main
git push -u origin codex/review-lab

在 GitHub 的 Pull requests 选 New pull request,base 选 main、compare 选 codex/review-lab,检查 Files changed 只有测试,再贴上整理好的标题与说明,选 Create pull request;仍要讨论可用 draft 状态。没有设定 CI 的练习库不会凭空出现测试检查,有 CI 时要核对它检查的是目前 head。这一步可先停在 PR,合并与部署各自依专案流程处理。

让测试纪录对应到最后版本

完成本机提交后,暂停其他会改这个练习库的任务,逐行执行下列命令。前后 HEAD 应相同、status 应干净、分支应为 codex/review-lab、main...HEAD 应只有 review.test.mjs,测试应 5 过 0 败且没有跳过项目。把实际 SHA 和输出附在交付纪录。HEAD 相同但档案还有修改时,测试其实包含未提交内容,不能把结果全算到那个 commit 上。

终端机:核对受测版本与最终差异 · sh
git branch --show-current
git rev-parse HEAD
git status --short --untracked-files=all
git diff --name-only main...HEAD
node --test core.test.mjs review.test.mjs
git rev-parse HEAD
git status --short --untracked-files=all

依 Git diff 官方说明,main...HEAD 从两者共同祖先比较到 HEAD;它不会把尚未提交的修改算进去。因此新增 review.test.mjs 但还没 git add 时,普通 diff 可能空白,仍要看 status 并开档审查。这里使用本机 main;正式 PR 要核对实际 base、head 和该 head 的 CI。看到 skipped、cancelled 或测试尚未完成,都分开记录,不以绿色图示取代检查范围。

常见问题、还原与验收

现象要补的证据
原测试全过仍有问题新案例先失败、修正后通过
Review 没看到差异确认未提交、commit 或 base 范围
Review 指出问题但说不出原因要求位置、触发与最小重现
PR 包含其他档案检查暂存、分支起点及 base/compare
CI 没出现或看的是旧版本查工作流程是否存在及 head SHA
有人继续改档重验最终差异,不沿用旧结论

验收要保留原三测试漏失问题、新两测试抓到问题、最终五测试通过的对照,以及只有测试档的提交。想重做就在同一独立练习重新引入 reverse,确认失败后再恢复,不删除整个 Git 库或改写公开历史。若已开练习 PR 而决定不合并,可在 GitHub 关闭它并保留讨论。图中 1 是测试证据,2 是审查判断,3 是可核对交付;本篇未替你执行模型 Review、GitHub 推送或公开操作。

21. 测试、Code Review 与 PR — 实作顺序示意图,非产品介面截图。 Tests → Review → PR
21. 测试、Code Review 与 PR — 实作顺序示意图,非产品介面截图。 Tests → Review → PR · 图片:Mokaair (© Mokaair)
阅读完整文字说明

Tests to Review to PR

回总目录

  • 生活分享

    Codex 学习中心:完整教程目录

    从安装、第一个任务到 MD 规则与进阶集成,规划 60 篇 Codex 教程、十个单元。按程度、平台、需求或命令搜索下一篇;尚未公开的教程会标示状态,方便安排学习路线。

  • 生活分享

    Worktree 与多任务隔离

    Worktree 让同一个 Git 程式库有不同的工作目录,各自承接不同分支。它适合让两项工作分开改档,但资料库、连接埠与外部服务仍可能共用,不能把档案隔离当成所有资源隔离。

  • 生活分享

    实战:制作小网站

    从 brief.md 规划并制作 Small Steps 待办网站,完成新增、完成、删除、筛选与本机资料保存。将 HTML、CSS、资料函式、画面事件与测试分开,以 Node 测试和浏览器操作验收,并留下可重新启动与还原的交接纪录。

  • 生活分享

    用量与效率:减少重工

    记录任务条件、模型选项、时间与成果,找出能减少无效重试和过多上下文的调整。

最新旅游情报攻略

资料来源

生活分享