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 格式化方式。

后续步骤