第 8 章 crate 与模块(2)
吉姆•布兰迪
8.6 测试与文档
正如 2.3 节所述,Rust 中内置了一个简单的单元测试框架。测试是标有 #[test] 属性的普通函数:
cargo test 会运行项目中的所有测试:
(你还会看到一些关于“文档测试”的输出,我们稍后会讲到。)
无论你的 crate 是可执行文件还是库,你都可以通过将参数传给 Cargo 来运行特定测试:cargo test math 会运行名称中包含 math 的所有测试。
测试通常会使用 assert! 和 assert_eq! 这两个来自 Rust 标准库的宏。如果 expr 为真,那么 assert!(expr) 就会成功;否则,它会 panic,导致测试失败。assert_eq!(v1, v2) 和 assert!(v1 == v2) 基本等效,但当断言失败时,其错误消息会展示两个值。
你可以在普通代码中使用这些宏来检查不变条件,但请注意 assert! 和 assert_eq! 会包含在发布构建中。因此,可以改用 debug_assert! 和 debug_assert_eq! 来编写仅在调试构建中检查的断言。
要测试各种出错情况,请将 #[should_panic] 属性添加到你的测试中:
在这个例子中,还需要添加一个 allow 属性,以让编译器允许我们做一些它本可以静态证明而无法触发 panic 的事情,然后才能执行除法并丢弃答案,因为在正常情况下,它会试图阻止这种愚蠢行为。
还可以从测试中返回 Result<(), E>。只要错误变体实现了 Debug 特型(通常都实现了),你就可以简单地使用 ? 抛弃 Ok 变体以返回 Result:
标有 #[test] 的函数是有条件编译的。普通的 cargo build 或 cargo build --release 会跳过测试代码。但是当你运行 cargo test 时,Cargo 会分两次来构建你的程序:一次以普通方式,一次带着你的测试和已启用的测试工具。这意味着你的单元测试可以与它们所测试的代码一起使用,按需访问内部实现细节,而且没有运行期成本。但是,这可能会导致一些警告。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
Rust中的测试与文档是本文的主要内容。文章首先介绍了Rust中的单元测试框架,包括编写测试函数和处理错误情况的测试。其次,阐述了集成测试的概念和用法,以及如何使用Cargo运行集成测试。另外,还介绍了如何使用Cargo生成库的HTML文档,并展示了文档型注释的使用方法,包括文档测试的概念和用法,以及如何指定依赖项。此外,还介绍了在Cargo.toml文件中指定版本的方法,以及Cargo.lock的作用和使用。最后,文章提及了将crate发布到crates.io的简单步骤。此外,还介绍了Cargo工作空间的概念,以及一些其他有用的资源。整体而言,本文内容涵盖了Rust中测试与文档的方方面面,为读者提供了全面的了解和指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论