【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/7/23 18:52:42 阅读更多 →
RNN训练中的梯度问题与梯度裁剪实战解析

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

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

2026/7/23 18:52:42 阅读更多 →
OpenClaw提示词工程:AI高效交互的核心技术解析

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

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

2026/7/23 18:52:42 阅读更多 →

最新新闻

问题:如何监控生产时效,提升效率?

问题:如何监控生产时效,提升效率?

引言:计划表≠生产效率 在工厂的日常运营中,生产计划表(或称排程表)是生产的“指挥棒”。然而,许多管理者常常陷入一个误区:认为只要计划表做得漂亮、排得满,生产效率就自然上去了。他们每天盯着…

2026/7/23 19:08:48 阅读更多 →
【Springboot毕设全套源码+文档】基于springboot电脑商城系统的设计与实现(丰富项目+远程调试+讲解+定制)

【Springboot毕设全套源码+文档】基于springboot电脑商城系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 19:08:48 阅读更多 →
Agentic自主进化机制:合成数据与强化学习的实践

Agentic自主进化机制:合成数据与强化学习的实践

1. 项目概述:Agentic自主进化机制的核心逻辑去年在开发一个对话系统时,我遇到了典型的数据瓶颈——人工标注成本高、覆盖场景有限。当时尝试用强化学习(RL)做在线学习,但探索效率太低。直到看到Agentic自主进化这个概念…

2026/7/23 19:08:48 阅读更多 →
区域功能节点的工程角色:国家数据基础设施的跨域路由层怎么理解

区域功能节点的工程角色:国家数据基础设施的跨域路由层怎么理解

“区域功能节点—业务节点—接入连接器”正在成为国家数据基础设施的通用架构语言。这套分层最早在跨省数据流通的生产实践中成型,本文从工程视角拆解每层的职责边界与设计要点。三层各管什么。接入连接器是终端接入层:负责数据源接入、规则执行与使用控…

2026/7/23 19:08:48 阅读更多 →
限时开放|AI自动发邮件SOP模板库(含27个行业话术+13类触发条件+5套A/B测试方案),仅剩最后83份授权码

限时开放|AI自动发邮件SOP模板库(含27个行业话术+13类触发条件+5套A/B测试方案),仅剩最后83份授权码

更多请点击: https://codechina.net 第一章:AI自动发邮件教程 AI驱动的邮件自动化正成为提升工作效率的关键实践。本章聚焦于使用Python结合主流AI与邮件服务API,构建可定制、可扩展的自动发信系统。核心依赖包括 openai(用于生成…

2026/7/23 19:08:48 阅读更多 →
Windows安装Ubuntu20.04系统(双系统)

Windows安装Ubuntu20.04系统(双系统)

安装准备:一个空白U盘(≥4G),电脑足够的空闲硬盘空间(用来安装Ubuntu系统) 1.Ubuntu镜像文件 历史版本选择“其他下载”——“查看历史版本”——“找到所需版本(个人下载选择桌面映像&#x…

2026/7/23 19:07:48 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻