consistency 教程
本页面向维护者,介绍如何运行跨包一致性测试,以及当某项改动涉及多个数值包时如何添加新的定律。
快速入门
在包含该模块的工作区中运行该套件(仓库的包装脚本可保持构建目录干净):
sh tools/run_moon_clean_exec.sh test -p Luna-Flow/floating/consistency --target native
通过的运行以 passed: N, failed: 0 结尾。该套件也是 just pr 的一部分。
日常任务
运行单个测试
sh tools/run_moon_clean_exec.sh test -p Luna-Flow/floating/consistency \
--filter "decimal quantize*"
添加跨包定律
在 core_wbtest.mbt(算术定律)或 api_audit_wbtest.mbt(可观察的 API 行为)中编写白盒测试。尽可能以精确预言(oracle)来表述定律:
///|
test "bin_float addition of small dyadics is exact" {
let a = @bin_float.BinFloat::from_int(3)
let b = @bin_float.BinFloat::from_int(5)
let sum = @semantic.SemanticScalar::from_bin_float(a + b)
let exact = @semantic.SemanticScalar::from_bin_float(
@bin_float.BinFloat::from_int(8),
)
assert_true(sum == exact)
}
测试 GDA 同值类(cohort)或标志规则时,使用官方 decTest 行作为固定的见证,并在测试名中注明该行的 id。
确定测试的归属
只涉及单个包的定律放在该包自己的测试中。当测试需要两个或更多包、需要在 internal 辅助函数所属包之外使用它们,或者需要诸如 semantic 精确有理数这样的预言时,才应放在这里。
深入了解
- 符合性语料(验证)将每个核心与外部参考进行比对;本套件则将各核心相互比对,并与精确算术比对。
- internal 教程 展示了若干测试所用到的辅助函数。
常见陷阱
- 在工作区中运行。 该包导入了同级的 Luna-Flow 模块;请使用仓库的包装脚本,或使用能解析这些模块的工作区。
- 保持测试确定性。 使用固定的随机种子和显式的上下文;任何测试都不得依赖计时或目标平台的
Double格式化方式。
后续步骤
- consistency API:文件布局。
- consistency 设计:该套件所证明的内容。