软件系统就像具有齿轮和其他部件的机器。如果任何一个齿轮发生故障,那么整个机 器很有可能无法正常运转。在软件中,各个齿轮就是你所使用的功能、模块或程序库。软 件系统的各个组件的功能测试是保证代码高质量、有效且实用的方法。它并不能验证代码中是否存在 bug,但有助于建立开发人员将代码部署到生产环境中的信心,并在项目长期维护时保持代码的健壮性。

    此外,如果没有单元测试,就很难在软件中进行大规模重构。在软件中明智而均衡地 使用单元测试的好处是长远的。在代码实现阶段,编写良好的单元测试是软件组件的非正 式规范。在维护阶段,现有的单元测试可以用来防止代码库的回归,从而鼓励系统立即修 复问题。在 Rust 这样的编译语言中,由于编译器提供了有用的错误诊断信息,单元测试的 回归所涉及的重构(如果有的话)会受到更多“指导”,因此效果更好。

    单元测试的另一个好处在于,它鼓励程序员编写主要依赖于输入参数的模块化代码, 即无状态函数。这使得程序员能够避免编写依赖于全局可变状态的代码。依赖于全局可变 状态的测试很难构造,但是,单纯考虑为一段代码编写测试的行为有助于程序员在实现过 程中找出一些低级的错误。对任何试图了解代码库的不同部分之间如何相互作用的新手来 说,它们也是非常好的文档。

    需要注意的是,测试对任何软件项目都是不可或缺的。现在,让我们看看如何在 Rust 中编写测试,首先从如何组织测试的结构开始。