盲测套件
该套件是源自合约的独立证据,而非合规性定义,因此测试失败表明实现或测试有问题,而合约永远正确。
test-writer 决定每个测试的形状,test-oracle-reviewer 决定什么算作独立值;该技能围绕它们提供隔离。
作者看到的内容
合约文件、合约所针对的接口(合约 crate 或模块、其类型和文档)以及已发布的来源:规范、供应商提供的向量、捕获数据。 不包含实现、早期实现或产生该合约的拉取请求,因为每个都包含对合约的解读,而该套件本应对此进行测试而非确认。 当实现存在时,作者是在一个不包含该实现的工作树中,处于一个没有该实现的提交上的全新上下文;禁止阅读列表补充且不取代此隔离,因为一旦上下文看到了实现,就无法再“忘记”。
预期值
来自测试中引用的已发布来源、合约声明的属性,或者合约或引用的标准固定了推导方法的推导值,记录在向量旁边以便审查者可以重新计算;绝不能来自只有合约实现才能执行的计算,因为检查这样的值意味着再次实现合约。 推导的向量必须考虑更改所影响的所有耦合字段——长度、校验和、签名——否则其结果就不符合推导的宣称。 在没有已发布答案的情况下,跨实现比较输出;差分检查绝不能单独存在,因为两个实现共享的 bug 会使其通过。 手工编写的负输入与独立有效的控制输入仅在目标维度上不同,这样测试只能因命名原因失败;一个命名被拒绝输入的规则必须获得一个这样的测试,因为仅通过接受来测试的规则可以通过接受一切来满足。 供应商提供的来源保留起源、版本和校验和记录,整体使用或在其自己的章节边界处切割,且从不编辑,因为编辑或切割的向量失去了使其成为 Oracla 的来源证明。 在套件旁保留覆盖率记录:哪个测试检查哪个子句,哪些子句仅通过审查验证,以及故意不检查的边界,这样沉默不会被误认为是覆盖率。
审查与合并
审查者运行 test-reviewer 并双向检查合约与覆盖率记录:每个子句都有测试或记录的空缺,每个测试都引用其子句。
在实现之前编写套件;一旦有一个实现能绿色通过,就合并它,这样任何合规实现都无法通过的测试会在它绑定所有后续实现之前被发现。
实现期间保持只读
实现拉取请求从不编辑套件或合约。 看起来有问题的测试,或没有测试的子句,会连同向量或子句、预期值和观察到的值以及引用的来源一起上报。 修复将转到拥有该套件的拉取请求——如果是开放中的,通过其负责人;如果是已合并的,则发新的拉取请求——由具有相同输入的新作者执行,该作者接收决策而不接收实现的输出,从而保持套件的“盲”状态。