发布时间:2026/7/23 18:52:20
【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。

相关新闻

2026/7/23 18:52:20

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

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

2026/7/23 18:47:20

mpweixin 微信打卡小程序

一、关键词微信打卡、积分兑换、打卡排行、惩罚措施、社交论坛二、作品包含源码数据库全套环境和工具资源本地部署教程三、项目技术前端技术: Html、Css、Js、Vue2.6、Element-ui、uniapp后端技术:Java、SpringBoot2.2.2、MyBatis-Plus四、运行环境&…

2026/7/23 18:47:20

【Rust自学】4.2. 所有权规则、内存与分配

4.2 所有权规则、内存与分配 4.2.0 写在正文之前 在学习了 Rust 的通用编程概念后,就来到了整个 Rust 的重中之重——所有权。它跟其他语言都不太一样,很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。 本章有五小节&#xf…

2026/7/23 20:12:25

告别吃灰!用Orange Pi R1 Plus和OpenWRT 21.02,低成本打造家庭软路由/旁路由(保姆级刷机+网络避坑)

用Orange Pi R1 Plus打造高性能家庭网络中枢:从刷机到进阶配置全指南 在智能家居设备激增的今天,传统路由器常常力不从心。Orange Pi R1 Plus凭借其双千兆网口和低功耗特性,成为搭建家庭网络控制中心的理想选择。本文将带你从零开始,解锁这款开发板的全部潜力。 1. 为什么…

2026/7/23 20:12:25

熟练掌握STL常用函数 map函数(基础)

map函数常用用法1.前提&#xff1a;头文件#include<map>2.特点&#xff1a;int 按从小到大键唯一&#xff0c;不能重复&#xff01;重复会覆盖&#xff01;mp["xiaoming"] 85; mp["xiaoming"] 100; // 会覆盖&#xff01;结果是 100map<int ,in…

2026/7/23 20:12:25

别人用4个麦,AR1106只用2个麦做到180°覆盖——凭什么是它?

本文从声源定位的底层原理出发&#xff0c;拆解 AR1106 声源定位模组"2麦实现180覆盖"背后的技术逻辑&#xff0c;对比主流4麦方案的设计差异&#xff0c;分析其在成本、精度、集成度上的取舍策略。不是软文&#xff0c;是技术拆解。 一、先抛问题&#xff1a;2麦 vs…

2026/7/23 20:12:25

基础三⼤查找

内查找和外查找&#xff1a;查找也有内查找和外查找之分。若整个查找过程都在内存中进⾏&#xff0c;则称之为内查找(internal search)&#xff1b;反之&#xff0c;若查找过程的需要访问外存&#xff0c;则称之为外查找(external search)。 1、顺序查找 从表中的第⼀个&#x…

2026/7/23 20:12:25

ADB常用命令(WinOS)

ADB即Android Debug Bridge&#xff0c;作为Android开发的常用调试工具。Why简言之&#xff0c;我用它主要做三件事。安装Apk查看Debug日志大概查看App的内存峰值和初步判断是否存在内存泄漏Where is ADB直接下载一个含ADB可执行文件的Zip包&#xff0c;解压到本地目录&#xf…

2026/7/23 20:07:24

AI论文助手哪个好用?2026年4款横评,写作查重降重一站搞定

【一句话答案】AI论文助手好不好用&#xff0c;看它能不能覆盖"写作—查重—降重—检测—排版"全流程——毕业之家ai&#xff08;www.biye.com&#xff09;从ai生成开题报告到答辩PPT一站配齐&#xff0c;实测一个账号走完整篇论文&#xff0c;不用在多个平台间反复横…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/23 0:01:10

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

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

2026/7/22 21:00:12

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…