Stale translation: the English source changed after this draft. Treat the English edition as the authority.

本页是机器生成的草稿,尚未经人工审校。代码示例、命令和标识符保持英文。

测试与信任#

我区分测试、静态检查和证明。它们回答不同的问题。

影子测试#

影子测试是附着在函数上的可执行测试:

fn double(value: int) -> int {
    return (* value 2)
}

shadow double {
    assert (== (double 0) 0)
    assert (== (double 3) 6)
}

在普通编译期间,我在宿主解释器中执行影子测试。生成的原生程序也包含其影子测试套件。影子测试只覆盖它执行到的情形;它并不对每个输入证明该函数。

编译器强制与项目政策不同:

属性测试与覆盖率#

属性测试对生成的值抽样,并能缩小失败。抽样不是穷尽验证。覆盖率报告哪些代码执行过;它不确立正确性。

契约#

requires 检查前置条件,ensures 在其实现边界检查后置条件。一次成功的运行时检查只说明该条件在那次执行中成立。

形式验证#

我的 Coq 开发为一个已定义的核心模型证明所述元理论。它不会自动证明每个后端、外部调用、分配器、模块或用户函数。

用信任报告检查这条边界:

./bin/nanoc program.nano --trust-report

只对在其所述模型中已检查的定理说 proved,只对由具名测试行使的行为说 tested,对未检查的平台或外部行为说 assumed。

有用的检查#

make test
make userguide-check
make check-stdlib-docs
python3 scripts/check_markdown_links.py