type
Post
date
Nov 5, 2025
slug
Rust/notebook/11
summary
学习下 Rust 圣经,记录笔记
status
Published
tags
Rust
category
技术茶点
icon
password
😀
Rust 语言中自动化测试的重要性、机制,以及如何组织单元测试和集成测试,以确保代码的正确性,尽管测试无法完全证明错误的绝对不存在。

11.编写自动化测试

11.1.如何编写测试

概念
含义
关键点
测试函数(Test function)
用于验证非测试代码是否按预期工作的一段代码。 (doc.rust-lang.org)
测试函数前需加 #[test] 属性。 (doc.rust-lang.org)
测试结构(Anatomy)
一般包括三步:准备数据/状态 → 调用目标代码 → 断言结果。 (doc.rust-lang.org)
例如用 assert_eq!assert! 宏检查行为。 (Massachusetts Institute of Technology)
#[cfg(test)] 模块
用于包裹测试代码,仅在运行 cargo test 时编译。 (rust-book.cs.brown.edu)
测试代码与主逻辑分隔,有助于构建及发布。
断言宏 (assert!, assert_eq!)
用于判断测试结果是否符合预期,失败时触发 panic! 从而使测试失败。 (Massachusetts Institute of Technology)
assert_eq!(left, right) 比较两个值是否相等,更常用。
返回 Result<T, E> 的测试
测试函数也可以返回 Result<(), E>,以使用 ? 运算符简化错误处理。 (doc.rust-lang.org)
使用这种方式时不能再使用 #[should_panic] 属性。 (Massachusetts Institute of Technology)

11.2.控制测试如何运行

概念
含义
关键点
运行所有测试
使用命令 cargo test 编译并运行项目中的单元测试、集成测试、文档测试。 (doc.rust-lang.org)
默认会以测试模式构建,并自动运行所有包含 #[test] 的函数。 (doc.rust-lang.org)
并行执行
测试默认在多个线程中并行执行以加快反馈。 (Massachusetts Institute of Technology)
因此测试之间不能依赖共享状态(如同一文件、同一全局变量)。
输出捕获
默认情况下,测试中的 println! 等输出会被捕获,在 测试失败 时才显示。 (doc.rust-lang.org)
若想即使测试通过也显示输出,可以传递 -- --show-output-- --nocapture。 (Massachusetts Institute of Technology)
运行指定测试
可通过 cargo test <filter>cargo test -- --test-threads=1 等命令筛选或控制运行方式。 (rust-book.cs.brown.edu)
例如:cargo test one_hundred 只运行名称中含 one_hundred 的测试。
忽略(ignore)测试
可给某些测试标记 #[ignore],默认不会运行。若要运行被忽略的测试,使用 cargo test -- --ignored。 (doc.rust-lang.org)
常用于耗时较长或特殊环境下才运行的测试。

11.3.测试的组织结构

概念
含义
关键点
测试分类:单元测试 (unit tests) vs 集成测试 (integration tests)
单元测试:小范围、模块内测试,可测试私有接口。集成测试:在 tests/ 目录下,与库分开,使用公共 API 测试多个模块协作。 (Rust 文档)
合理使用两种测试形式,可保证代码模块自身正确 + 模块之间协作正确。
单元测试的位置与写法
放在 src 代码同一文件中、通常在文件末尾,使用 #[cfg(test)] mod tests { … } 声明模块。 (Rust 文档)
tests 模块内用 use super::*; 引入被测试模块的内容。
集成测试的位置与写法
在项目根目录下新建 tests/ 目录,每个 .rs 文件作为一个测试 crate,直接调用库的公共 API。 (Rust 文档)
不需要 #[cfg(test)],因为 tests/ 目录中的代码只在执行 cargo test 时编译。
何时测试私有接口
单元测试可以访问私有函数/项,因为在同一 crate 内;集成测试不能,只能访问公开 API。 (Massachusetts Institute of Technology)
若想测试私有实现细节,写在单元测试;若测试用户使用库的方式,就用集成测试。
二进制 (binary) crate 与测试限制
如果项目只是 src/main.rs(无 src/lib.rs),那就难做集成测试,因为没有公开库 API 可供 tests/ 使用。 (Rust 文档)
常见做法:将逻辑放在 src/lib.rssrc/main.rs 调用库,这样既能让程序运行也能测试。
 
《Rust 程序设计语言》(12/22)《Rust 程序设计语言》(10/22)
Loading...