Prove It
建立一个狭窄的声明:同一个测试在修复前捕获指定的缺陷行为,并在修复后通过。仅凭测试套件通过不足以建立此声明。
选择见证者
检查修复和相关测试。识别预期的输入/输出或状态转换,并选择一个特定的 pytest 节点。使用两个已提交的本地 Git ref;after ref 必须同时包含修复和测试。未提交的编辑不包括在内。不要为了运行此工具而提交他人的工作。
缺陷断言需要一条特定的消息,例如:
assert expired(now=10, deadline=10), "PROVEIT:expiry-boundary"
该消息必须位于所选测试函数中的某个断言上。不要将其放在无关的断言、fixture、应用程序代码或 print 语句中。检查该断言是否实际观察到了缺陷所描述的行为。如果现有测试需要消息,仅限在授权的编辑范围内添加,并将该测试包含在 after 修订中。否则,请解释缺失的输入。
运行比较
使用其绝对安装路径运行捆绑脚本。所选解释器需要已安装 pytest 和项目依赖。不执行依赖安装、网络访问、Git 检出、重置、贮藏或提交。
python <skill-directory>/scripts/proveit.py --repo <repository> --before <old-ref> --after <fixed-ref> --test tests/test_expiry.py::test_at_deadline --expect PROVEIT:expiry-boundary --output <new-directory-outside-repository>
运行器将 after 修订中选定的测试文件叠加到两个快照上,每次使用新的副本,默认每次修订运行三次,每次运行超时 10 秒。仅根据任务需要使用 --python、--repeat 2..5 或 --timeout。如果测试是参数化的,请选择完整的参数 ID。
快照隔离文件,而不是执行环境。仅运行本环境中已被授权的代码。测试保留用户的文件系统、网络和凭据访问权限。不要将临时目录解释为安全沙箱。切勿清理无关的工作树或目录。运行器仅移除自己的临时快照,并将证据目录保留以供审查。
审查证据
阅读 report.md、report.json、selected-test.py、fix.diff 和相关日志。检查观察到的断言、所选节点、阶段记录以及更改的路径。
| 结果 | 解释 | 退出码 |
|---|---|---|
supported | 每次旧运行都命中声明的断言;每次新运行都通过。 | 0 |
not_supported | 旧测试也通过,或修复后的修订仍然命中该断言。 | 1 |
inconclusive | 环境、无关失败、超时、跳过、不完整或不稳定的执行。 | 2 |
即使新修订通过,由于无关的调用失败也属于不确定结果。收集、依赖、语法、设置和拆卸失败永远不能作为见证。不要将其重新标记为已捕获的缺陷。在范围内解决观察到的原因并重新运行到新的证据目录中;不要重复未更改的失败设置。
在接受 supported 之前,检查特定于修订的 fixtures/配置,并确认它们不能解释变化。只有选定的测试文件会被叠加。已安装的依赖项是共享的,第三方 pytest 插件的自动加载被禁用,项目的 addopts 已被清除。需要外部插件或构建的项目可能需要单独准备的环境;如实报告不支持的执行情况。
报告测试、ref、结果、证据位置以及关键限制。说明此见证者在这些运行中捕获了指定的行为。不要声称证明了整体正确性、没有随机性、一般测试质量或可衡量的生产力提升。在未审查并获取适用的发布授权前,不要发布包含本地路径或日志的报告。