OxideTerm 测试审计 是做什么的?
在拥有该行为的层级上保持有用的回归保护。使用能解决所请求变更的最小审查范围;根据所保留的契约和检测到的错误来评判结果,而不是测试数量或删除的行数。
阅读适用的 AGENTS.md。从仓库根目录运行命令。验证矩阵和测试指南定义了项目特定的检查;本技能提供测试质量决策。
选择范围
- 编写或修改测试: 将编写问题应用于该行为,并检查其最接近的现有覆盖范围。
- 诊断失败: 确定测试失败的原因,以及在编辑之前是实现、期望、fixture 还是环境出了问题。
- 审计现有测试: 审查所请求的模块或行为,并为每项提议的变更记录证据。仅当被明确要求时,才将范围扩展到整个子系统。每个批次使用相同的证据标准。
创建或调用本技能不会授权进行宽泛的清理、子代理、提交、推送或 PR。尊重用户现有的授权以及任何仅审查的边界。当编辑已被授权且证据充分时,无需另一轮批准即可继续。
编写问题
在添加或修改测试之前,请确定:
- 被保护的可观察行为或独立契约。
- 一个合理的回归以及该回归会失败的特定断言。
- 最接近的现有覆盖范围遗漏了什么。在适当时扩展该覆盖范围;另一层需要不同的集成、协议或生命周期风险。
- 该测试是否需要生产环境的导出、开关、包装器或注入钩子,而这些钩子在业务调用方中并不存在。优先在现有的所属边界处进行测试。
使用独立于实现的期望值。Fixtures 必须能够区分正确行为和可能的错误:在测试过滤器时包含被排除的候选对象,在测试排序时包含不同的排序键,在检查脱敏时包含实际的敏感输入。构造函数字段的往返、非空结果或执行了被断言行为的 mock 都不足以证明预期的工作流。
测试助手和 fixtures 可以合法地仅用于测试。关注点是扭曲生产 API 或仅为了测试而保留过时的生产行为。
诊断失败的测试
阅读完整的测试、其输入、生产路径、附近的覆盖范围以及相关的变更历史。对于 CI,确定失败的提交、作业、测试名称和断言;通用的非零退出码不是根本原因。当断言依赖于依赖项的行为时,检查其源代码或类型。
根据证据对失败进行分类:
- 产品回归: 预期的契约仍然有效。复现失败并在授权范围内修复相关的实现。
- 过时的期望: 历史记录和当前契约显示有意的行为变更。更新预期的行为,同时保留对受支持发布格式和 API 的保护。
- 有缺陷的测试或 fixture: 测试用例并未执行其所声称的条件,依赖于偶然状态,或由于不相关的原因而失败。在实际边界处修复设置和断言。
- 环境失败: 编译、依赖项、资源、平台或外部 fixtures 阻止了行为的测试。报告该限制;不要将其重新解释为通过或过时的测试。
基线失败不是删除测试的理由。对于错误修复,在修复前演示预期的失败,在修复后演示成功。当能证明相同的失败时,可重用有效的 CI 证据或捕获的本地基线;不要仅仅为了形式而重复昂贵的检查。
例如,.oxide 插件测试需要区分免密验证和解密导入预览。加密格式的验证响应不应泄露元数据;包含密码的预览应仍然包含明确预期的描述和连接名称。更新这些断言可以保留契约,而无需在插件层进行另一个低级别的解密测试。
审计前先阅读
完整阅读每个候选测试,包括参数行。追踪其生产入口点、调用者、相关依赖项、兄弟实现以及重叠的测试。检查历史记录以了解其存在的原因,以及 CI 路由以了解哪些检查实际运行。
对提议的变更使用紧凑的证据记录,除非要求保存报告,否则在工作响应中包含:
| 测试和位置 | 行为和可信失败 | 决策 | 剩余或已修复的证明 | 验证 |
|---|---|---|---|---|
| 确切的测试名称和路径 | 断言能检测到什么 | 保留 / 修复 / 合并 / 删除 | 命名的测试或边界,附带相关历史 | 聚焦的命令或手动场景 |
- 保留: 它独立保护一个有意义的契约。
- 修复: 行为很重要,但输入、断言、名称或预期结果是错误的或太弱。
- 合并: 在删除重复的设置或用例之前,将不同的断言移动到命名的主测试中。
- 删除: 命名更强有力的剩余证明,或表明该行为不再有受支持的契约。不确定性意味着调查或保留。
对于随测试一起删除的生产代码,还要识别其非测试调用者以及代码过时的原因。在删除助手、导出、功能或 fixture 之前搜索引用。不要将无关的简化作为审计的一部分。
值得调查的模式
- 测试重复了实现的源代码、私有调用方式或精确的内部表示,并在行为保持不变的 refactor 后失败。
- 多层使用等效输入调用同一个助手,并重复其断言,而没有锻炼自身的集成。
- Fixture 预安排了回调顺序、完成通知或持久化结果,而这些理应由实际拥有者产生。
- 一个拒绝测试在到达其所声称测试的权限检查之前,被参数验证拒绝。
- 一个并发、取消或唤醒测试仅检查最终标志,而没有创建竞争的工作或等待者。
- 当内容、身份、顺序或持久副作用才是契约时,成功断言仅检查
Ok、Some、长度或非空。
这些是调查信号,而不是自动删除规则。保留独立的安全默认值、协议字节、持久化和迁移格式、插件 API、平台行为、打包、国际化以及架构约束。静态检查在它保护真实契约并能承受无关重命名时是有用的。执行缓慢本身并不使测试冗余。
OxideTerm 边界
| 行为 | 首选验证边界 |
|---|---|
| 解析、设置规范化、序列化或数据合并 | 拥有该领域的 crate,带有显式的期望值和受支持格式样本 |
| SSH 节点共享、SFTP、转发、重连或跳板机 | 运行时拥有者,带有实际的消费者注册、取消和清理;参见运行时所有权 |
| 混合页面、焦点、弹窗或延迟 UI 结果 | 现有的 GPUI 测试上下文和功能实体;原生 IME、窗口和 GPU 行为仍需主机验证 |
| 插件、MCP 或 CLI 适配器 | 实际的调度和返回的数据、权限、目标身份或副作用;避免单独重放领域助手 |
| 脱敏和凭据生命周期 | 通过相关输出或所有权边界的合成秘密输入;参见敏感数据 |
| 打包和仓库脚本 | 现有的脚本测试或由验证矩阵选择的实际 dry-run 契约 |
对于共享节点测试,关闭一个终端应使另一个实际消费者仍然可用。对于过期结果处理,在拥有者变更后交付旧的完成。使用现有的 fixtures 和事件驱动的同步;任意睡眠和额外的重试并不能建立这些条件。
验证并完成
在开始其测试运行之前,完成相关的源代码/测试编辑。在此运行期间保持签出稳定。
- 运行聚焦的测试或模块,例如
cargo test -p <crate> <test_filter>。使用实际拥有它的目标和平台;桌面测试位于oxideterm-gpui-app的oxideterm-native二进制目标中。独立的远程代理使用--manifest-path agent/Cargo.toml。 - 读取结果并验证预期的测试确实运行了。零匹配测试的成功命令不是证据。在删除或移动后,运行命名的剩余覆盖范围和任何不同的受影响集成检查。
- 对 Rust 编辑运行
cargo fmt --check和git diff --check。根据验证矩阵添加 crate 检查、脚本测试、区域设置审计或手动工作流。在相关变更或新证据使其失效之前,可重用结果。 - 审查最终的 diff 和状态。确保没有独特行为消失,没有断言被削弱以隐藏产品失败,并且没有无关的工件被更改。
仅当需要解决关于断言的特定疑问时,才使用有意的突变。使其与用户工作隔离,之后恢复确切的源代码,并且不要对每个测试都要求这样做。子系统范围的审计应在运行最终的受影响套件之前,将删除的用例与命名的剩余测试进行核对。
报告决策、仍受保护的行为、实际运行的检查以及任何实质性的未验证边界。当发生删除时,解释被移除的覆盖范围。当请求的范围完成时停止;不要为了达到数量或减少目标而扩大审计。
来源
改编自 OpenClaw 的 test-audit 和 campaign guidance 中的测试价值和证据原则。此处执行、所有权和验证遵循 OxideTerm 的仓库规则。