Rust 程序设计(第 2 版)
Jim Blandy, Jason Orendorff, Leonora F. S. Tindall
软件工程师
1469 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
课程目录
已完结/共 41 讲
时长 02:41
时长 06:30
时长 10:04
时长 01:05
时长 50:06
时长 31:35
时长 34:39
时长 29:11
时长 37:15
时长 23:44
时长 44:19
时长 29:54
时长 39:01
时长 01:38
时长 01:15
时长 00:37
Rust 程序设计(第 2 版)
15
15
1.0x
00:00/00:00
登录|注册

第 8 章 crate 与模块(2)

8.6 测试与文档

正如 2.3 节所述,Rust 中内置了一个简单的单元测试框架。测试是标有 #[test] 属性的普通函数:
#[test]
fn math_works() {
let x: i32 = 1;
assert!(x.is_positive());
assert_eq!(x + 1, 2);
}
cargo test 会运行项目中的所有测试:
$ cargo test
Compiling math_test v0.1.0 (file:///.../math_test)
Running target/release/math_test-e31ed91ae51ebf22
running 1 test
test math_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
(你还会看到一些关于“文档测试”的输出,我们稍后会讲到。)
无论你的 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] 属性添加到你的测试中:
/// 正如我们在第7章中所讲的那样,只有当除以零导致panic时,这个测试才能通过
#[test]
#[allow(unconditional_panic, unused_must_use)]
#[should_panic(expected="divide by zero")]
fn test_divide_by_zero_error() {
1 / 0; // 应该panic!
}
在这个例子中,还需要添加一个 allow 属性,以让编译器允许我们做一些它本可以静态证明而无法触发 panic 的事情,然后才能执行除法并丢弃答案,因为在正常情况下,它会试图阻止这种愚蠢行为。
还可以从测试中返回 Result<(), E>。只要错误变体实现了 Debug 特型(通常都实现了),你就可以简单地使用 ? 抛弃 Ok 变体以返回 Result
use std::num::ParseIntError;
/// 如果"1024"是一个有效的数值(这里正是如此),那么本测试就会通过
#[test]
fn explicit_radix() -> Result<(), ParseIntError> {
i32::from_str_radix("1024", 10)?;
Ok(())
}
标有 #[test] 的函数是有条件编译的。普通的 cargo buildcargo build --release 会跳过测试代码。但是当你运行 cargo test 时,Cargo 会分两次来构建你的程序:一次以普通方式,一次带着你的测试和已启用的测试工具。这意味着你的单元测试可以与它们所测试的代码一起使用,按需访问内部实现细节,而且没有运行期成本。但是,这可能会导致一些警告。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust中的测试与文档是本文的主要内容。文章首先介绍了Rust中的单元测试框架,包括编写测试函数和处理错误情况的测试。其次,阐述了集成测试的概念和用法,以及如何使用Cargo运行集成测试。另外,还介绍了如何使用Cargo生成库的HTML文档,并展示了文档型注释的使用方法,包括文档测试的概念和用法,以及如何指定依赖项。此外,还介绍了在Cargo.toml文件中指定版本的方法,以及Cargo.lock的作用和使用。最后,文章提及了将crate发布到crates.io的简单步骤。此外,还介绍了Cargo工作空间的概念,以及一些其他有用的资源。整体而言,本文内容涵盖了Rust中测试与文档的方方面面,为读者提供了全面的了解和指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部