Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

编写自动化测试(Writing Automated Tests)

Edsger W. Dijkstra 在他 1972 年的论文《谦逊的程序员》(The Humble Programmer)中说:“程序测试可以非常有效地展示 bug 的存在,但对于证明 bug 不存在则是无能为力的。“这并不意味着我们不应该尽可能多地测试!

我们程序中的*正确性(correctness)*是我们的代码在多大程度上做了我们期望它做的事情。Rust 在设计中高度重视程序的正确性,但正确性是复杂的,不容易证明。Rust 的类型系统承担了很大一部分责任,但类型系统并不能捕捉所有问题。因此,Rust 包含了对编写自动化软件测试的支持。

假设我们编写一个函数 add_two,它将传入的任何数字加上 2。这个函数的签名接受一个整数作为参数并返回一个整数作为结果。当我们实现并编译该函数时,Rust 会执行你到目前为止学到的所有类型检查和借用检查,以确保例如我们不会向此函数传递 String 值或无效引用。但 Rust 不能检查这个函数是否会精确地执行我们的意图,即返回参数加 2,而不是例如参数加 10 或参数减 50!这就是测试发挥作用的地方。

我们可以编写测试来断言,例如,当我们向 add_two 函数传递 3 时,返回值是 5。我们可以在对代码进行更改时运行这些测试,以确保任何现有的正确行为没有发生变化。

测试是一项复杂的技能:尽管我们无法在一章中涵盖编写良好测试的每个细节,但在本章中,我们将讨论 Rust 测试工具的机制。我们将讨论在编写测试时可用的注解和宏、运行测试时提供的默认行为和选项,以及如何将测试组织为单元测试(unit test)和集成测试(integration test)。