真实 SQL 回归验证
把“代码看起来已修复”变成可复查的数据库行为证据。围绕用户指出的缺陷工作,遵守仓库现有贡献规范,优先使用已有测试框架和可复用的隔离测试实例。
明确可观察的缺陷
先记录触发条件、最小输入、预期结果与实际结果。跟踪用户可调用的 SQL 或公开接口,确定缺陷涉及返回值、错误语义、事务状态、持久化还是资源约束。没有明确预期时,查当前接口契约和相关既有用例,不把个人偏好当成数据库规范。
把场景缩成能单独运行的回归用例。断言应检查结果和状态,而非私有函数名、内部调用顺序或与实现逐行对应的细节。
- 结果无顺序保证时使用明确
ORDER BY或合理的集合比较;保留有意义的重复行,不擅自去重。 - 区分 SQL
NULL、空字符串、零和错误;数值按类型约定比较,避免格式或浮点表示掩盖差异。 - 错误行为优先核对约定的错误码/SQLSTATE及状态,不把可能本地化的整句日志当成唯一依据。
- 涉及提交、回滚、删除或迟到结果时,检查操作后的可见数据和必要的后续读取;仅看到某次请求成功不足以证明状态正确。
做有效的前后对照
- 确认控制版本。 记录原始提交、工作树状态和实际运行的服务版本。优先隔离原版与修复版,保留已有未提交工作,不为了复现而覆盖用户数据或重置不相关修改。
- 先运行原版。 同一回归输入必须在原版因目标行为失败。连接失败、服务未就绪、缺依赖、收集错误或断言路径根本没有执行,都不是缺陷复现。保留这些环境错误并解决后重跑,不改成“原版失败”的证据。
- 再运行修复版。 使用相同输入与成功标准,确认目标缺陷消失。不要通过修改预期值、放松断言、跳过关键用例或悄悄换数据让检查变绿。
- 验证相邻行为。 选择与变更直接相关的正常、边界、失败恢复和兼容场景。事务或持久化修复应按其合同覆盖独立连接、提交/回滚或重启后的公开读取。接口承诺的行为与未支持的功能分开记录。
原版已正确时,重新确认基线和触发条件;不要人为制造一个失败来填补证据链。修复版失败时先保存原始结果,再缩小原因。
证明运行的是被检验的实现
源码编译成功与真实数据库行为是两件事。需要真实实例的结论,应核实实例对应的可执行文件、构建来源、端口与配置,再通过客户端执行 SQL;看到旧进程、旧部署目录或日志中的版本号不能替代这些核对。
- C++ 单元测试、模拟响应、SQLite 替身、直接调用内部钩子,各自只能支持其实际覆盖范围;不能据此声称某个真实数据库、网络服务或宿主集成已通过。
- 对外部 AI/HTTP 服务,模拟响应可以验证解析、批次映射和失败处理;真实服务参与需要真实调用记录。不要捏造请求、响应或性能数据。
- 仅使用任务授权的隔离数据和测试对象。需要影响已有业务实例、升级部署或清理用户数据时,先准备可审查的改动与验证结果,再按适用授权要求执行。
记录测试数据身份、命令、退出码和关键输出。日志中不要写密码、访问令牌、带凭据 URL 或完整连接串;共享证据前做脱敏,保留定位问题所需的非敏感信息。
固定可复现结果
变更稳定后,在精确提交或可证明等价的干净副本上复验受影响用例及仓库必需检查。确认测试对应的源码、二进制与数据没有在运行中改变。检查官方/冻结测试资产保持,生成文件使用仓库规定的生成入口。
不要为了增加通过数而重复无关测试。扩大验证范围应由共享路径、失败、兼容风险或未解决的合同问题驱动。资源测试必须说明硬件、配置、计时边界与采样方式;进程峰值内存不等于全机峰值,单个组件耗时不等于端到端耗时。
交付证据
给出简短、可核对的结果:
- 缺陷的触发输入、预期行为及修复后的实际行为。
- 原版和修复版的提交/构建身份,以及原版因目标行为失败、修复版通过的记录位置。
- 相关回归和必要检查的结果,明确实际实例、模拟、跳过或未验证的部分。
- 精确提交、可复现命令、数据身份与仍存在的限制。
保留失败证据和已知未命中场景,不把“未发现问题”写成“全部合同已证明”。本地通过、提交受理、外部评测通过是不同状态;外部结果未返回时保持待确认。结论的范围必须与证据覆盖范围一致。
<!-- OB-S:sRUgOb7QzvNwvBfGPD0fWw -->
微信扫一扫