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) | |
#[cfg(test)] 模块 | 用于包裹测试代码,仅在运行 cargo test 时编译。 (rust-book.cs.brown.edu) | 测试代码与主逻辑分隔,有助于构建及发布。 |
断言宏 ( assert!, assert_eq!) | 用于判断测试结果是否符合预期,失败时触发 panic! 从而使测试失败。 (Massachusetts Institute of Technology) | assert_eq!(left, right) 比较两个值是否相等,更常用。 |
返回 Result<T, E> 的测试 | 使用这种方式时不能再使用 #[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) | |
运行指定测试 | 例如: cargo test one_hundred 只运行名称中含 one_hundred 的测试。 | |
忽略(ignore)测试 | 常用于耗时较长或特殊环境下才运行的测试。 |
11.3.测试的组织结构
概念 | 含义 | 关键点 |
测试分类:单元测试 (unit tests) vs 集成测试 (integration tests) | 单元测试:小范围、模块内测试,可测试私有接口。集成测试:在 tests/ 目录下,与库分开,使用公共 API 测试多个模块协作。 (Rust 文档) | 合理使用两种测试形式,可保证代码模块自身正确 + 模块之间协作正确。 |
单元测试的位置与写法 | 在 tests 模块内用 use super::*; 引入被测试模块的内容。 | |
集成测试的位置与写法 | 不需要 #[cfg(test)],因为 tests/ 目录中的代码只在执行 cargo test 时编译。 | |
何时测试私有接口 | 单元测试可以访问私有函数/项,因为在同一 crate 内;集成测试不能,只能访问公开 API。 (Massachusetts Institute of Technology) | 若想测试私有实现细节,写在单元测试;若测试用户使用库的方式,就用集成测试。 |
二进制 (binary) crate 与测试限制 | 常见做法:将逻辑放在 src/lib.rs,src/main.rs 调用库,这样既能让程序运行也能测试。 |
- Author:沈林曦
- URL:https://blog.aibhtt.com/article/Rust/notebook/11
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts












