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

编写自动化测试

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

程序的正确性(correctness)是指代码在多大程度上做到了我们期望它做的事情。Rust 在设计时就高度关注程序的正确性,但正确性是一个复杂的问题,不容易证明。Rust 的类型系统承担了很大一部分保障工作,但类型系统并不能捕获所有问题。因此,Rust 内置了对编写自动化软件测试的支持。

假设我们编写了一个 add_two 函数,它将传入的数字加 2。这个函数的签名接受一个整数作为参数,并返回一个整数作为结果。当我们实现并编译这个函数时,Rust 会执行你之前学过的所有类型检查和借用检查,以确保我们不会向这个函数传递 String 值或无效的引用。但 Rust 无法检查这个函数是否确实做到了我们期望的事情——即返回参数加 2,而不是参数加 10 或参数减 50!这就是测试发挥作用的地方。

我们可以编写测试来断言,例如,当我们将 3 传递给 add_two 函数时,返回值是 5。每当我们修改代码时,都可以运行这些测试,以确保任何已有的正确行为没有被改变。

测试是一项复杂的技能:虽然我们无法在一章中涵盖如何编写好测试的每一个细节,但在本章中我们将讨论 Rust 测试功能的机制。我们会介绍编写测试时可用的注解和宏、运行测试时提供的默认行为和选项,以及如何将测试组织为单元测试和集成测试。