【Rust自学】11.1. 编写和运行测试
11.1 编写和运行测试11.1.1. 什么是测试在Rust里测试就是一个函数用于验证非测试代码的行为是否符合预期。一个测试函数通常执行三个操作- 准备(Arrange)数据/状态- 运行(Act)被测试的代码- 断言(Assert)结果这三个操作在有些语言里叫3A步骤。11.1.2. 解剖测试函数测试函数本质上仍然是一个函数不同之处在于它必须用test属性(attribute)进行标注。Attribute就是一段Rust代码的元数据。它不会改变被它修饰的代码的逻辑只是对代码进行修饰或者说标注。实际上在 5.2. struct使用例加打印调试信息 中就已经用到过。在函数上加#[test]就可以把函数变为测试函数。11.1.3. 运行测试先不管测试函数内的内容编写完测试函数之后如何运行它呢使用cargo test命令来运行所有测试。这个命令会构建一个测试运行器(test runner)可执行文件。它会逐个运行标注了test的函数并报告它们是否成功。当使用Cargo创建library项目时会生成一个test module里面有一个现成的test函数可以参照它来编写其他测试函数。实际上你可以添加任意数量的test module或test函数。看个例子创建一个名为adder的新库项目$ cargo new adder --lib Creating library adder package note: see more Cargo.toml keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html $ cd adder打开项目lib.rspub fn add(left: usize, right: usize) - usize { left right } #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { let result add(2, 2); assert_eq!(result, 4); } }之所以这是一个测试函数是因为它被#[test]标注了而不是因为它位于test模块中。test模块里也可以包含普通函数。使用cargo test来运行测试$ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test profile [unoptimized debuginfo] target(s) in 0.12s Running unittests src/lib.rs (target/debug/deps/adder-302521ba8d0f0bdf) running 1 test test tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s分析一下这个输出- 首先是编译(Compiling)、完成(Finished)和运行(Running)。- 接下来是running 1 test表示正在执行一个测试。下一行显示这个测试是tests::it_works结果是ok。这个项目只有一个测试但如果有多个测试cargo test会全部运行。- 然后是test result: ok.表示项目中的所有测试都通过了。具体来说1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out表示1个通过、0个失败、0个被忽略、0个基准测试、0个被过滤掉。-Doc-tests adder指的是文档测试的结果。Rust能够编译出现在API文档中的代码这有助于保证文档始终与实际代码保持同步。如果把函数改名输出哪里会变呢pub fn add(left: usize, right: usize) - usize { left right } #[cfg(test)] mod tests { use super::*; #[test] fn exploration() { // 改名为 exploration let result add(2, 2); assert_eq!(result, 4); } }输出$ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test profile [unoptimized debuginfo] target(s) in 0.08s Running unittests src/lib.rs (target/debug/deps/adder-302521ba8d0f0bdf) running 1 test test tests::exploration ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s可以看到测试名从tests::it_works变成了tests::exploration。11.1.4. 测试失败测试函数一旦触发panic!测试就失败。由于每个测试都在自己的线程中运行主线程会监视这些线程。当主线程看到某个测试因触发panic!而崩溃时那个测试就会被标记为失败。看个例子pub fn add(left: usize, right: usize) - usize { left right } #[cfg(test)] mod tests { use super::*; #[test] fn exploration() { let result add(2, 2); assert_eq!(result, 4); } #[test] fn another() { panic!(Make this test fail); } }这个another函数直接调用了panic!。运行一下看结果$ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test profile [unoptimized debuginfo] target(s) in 0.08s Running unittests src/lib.rs (target/debug/deps/adder-302521ba8d0f0bdf) running 2 tests test tests::exploration ... ok test tests::another ... FAILED failures: ---- tests::another stdout ---- thread tests::another (448960) panicked at src/lib.rs:17:9: Make this test fail note: run with RUST_BACKTRACE1 environment variable to display a backtrace failures: tests::another test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass --libtests::another失败了而tests::exploration仍然是ok。失败原因是thread tests::another panicked at src/lib.rs:17:9意思是在src/lib.rs的第17行第9列触发了panic!也就是源代码中写该宏的位置。总结一下test result: FAILED表示整体测试运行失败。更具体地说是1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out。

相关新闻

【Rust自学】11.2. 断言(Assert)

【Rust自学】11.2. 断言(Assert)

11.2 断言(Assert) 11.2.1. 使用assert!宏检查测试结果 assert!宏来自标准库,用于判断某个条件是否为true。它接收一个返回类型为布尔值的表达式: - 当assert!内的值为true时,测试通过,assert!也不会做多余的操作。 - 当assert!…

2026/10/18 3:54:08 阅读更多 →
RNN训练中的梯度问题与梯度裁剪实战解析

RNN训练中的梯度问题与梯度裁剪实战解析

1. RNN训练的核心挑战解析循环神经网络(RNN)作为处理序列数据的经典模型,其训练过程远比前馈神经网络复杂。我在实际项目中使用RNN处理自然语言和时间序列数据时,最常遇到的三个"拦路虎"就是:梯度消失&#…

2026/10/18 3:53:36 阅读更多 →
OpenClaw提示词工程:AI高效交互的核心技术解析

OpenClaw提示词工程:AI高效交互的核心技术解析

1. OpenClaw提示词工程解析OpenClaw作为当前AI领域的热门工具,其核心提示词的质量直接决定了输出结果的专业性和可用性。这套完整中文版提示词库经过大量实际项目验证,包含超过200个经过优化的标准提示模板,覆盖技术咨询、内容创作、数据分析…

2026/10/18 3:53:00 阅读更多 →

最新新闻

ASP.NET MVC工作流管理系统源码解析:流程引擎与表单设计器实战

ASP.NET MVC工作流管理系统源码解析:流程引擎与表单设计器实战

简介:这是一套基于ASP.NET MVC5开发的工作流管理系统源码,内置可视化流程设计器与表单设计器,适合正在从事OA办公、CRM客户关系或HR人事管理系统的开发者参考学习,也可作为掌握MVC架构与工作流引擎原理的实战范例。压缩包共约2000…

2026/10/19 0:52:08 阅读更多 →
Rocky Linux 8.5部署Jenkins:跨平台CI/CD与容器化构建实战

Rocky Linux 8.5部署Jenkins:跨平台CI/CD与容器化构建实战

在Rocky Linux 8.5上部署Jenkins,这件事听起来不算新鲜,但真要把流水线做到能支撑跨平台CI/CD、还能把容器化构建跑得又快又稳,很多人是踩了坑才回头补课的。我这套方案是在某制造企业的研发基础设施改造中一步步磨出来的,前后在虚…

2026/10/19 0:52:08 阅读更多 →
新华DCS组态文件与工程师手册深度解析指南

新华DCS组态文件与工程师手册深度解析指南

简介:本资源为新华DCS系统核心工程资料包,面向工业自动化领域初/中级系统工程师、DCS运维人员及高校控制类专业实践学习者,聚焦系统组态实施与现场调试能力提升。资源包含1份HTML格式的下载说明页(含返币规则与使用提示&#xff0…

2026/10/19 0:51:08 阅读更多 →
UCIe 2.0系统架构深度解析:从芯粒互连到多die管理机制

UCIe 2.0系统架构深度解析:从芯粒互连到多die管理机制

UCIe 2.0规范发布之后,我翻得最多的章节其实是系统架构,而不是物理层波形或者链路层的CRC细节。原因很简单:1.0版本可以用“多芯片串在一起的高速接口标准”来理解,但到2.0,UCIe已经变成一套能管理、能配置、能安全启动…

2026/10/19 0:51:08 阅读更多 →
网管系统交付必读:概述文档、北向接口与告警管理实战指南

网管系统交付必读:概述文档、北向接口与告警管理实战指南

简介:《NCE-T网管操作系统概述》是一份面向华为传送网/微波网管方向的技术文档,适合网络运维工程师、系统集成人员以及对5G承载、网络自动化和智能运维感兴趣的读者。内容围绕NCE-T与U2000的架构对比展开,说明NCE-T如何继承原有管理域与NBI接…

2026/10/19 0:51:07 阅读更多 →
MATLAB与OpenDSS输配电联合仿真:有载调压与馈线调节器协同案例

MATLAB与OpenDSS输配电联合仿真:有载调压与馈线调节器协同案例

简介:这套基于MATLAB与OpenDSS开发的输配电系统联合仿真平台,面向计算机、电子信息工程及数学等专业学生的课程设计、期末大作业与毕业设计,也适合电力领域初学者作为入门工具。平台支持MATLAB 2014、2019a及2024a等多个版本,借助…

2026/10/19 0:50:07 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →