深入探究 Rust 测试:灵活控制测试的执行方式

一、并行测试与串行测试

Rust 的测试默认会并行执行,这样能显著减少运行整套测试的时间。不过,如果测试之间存在共享状态(例如同一文件名、环境变量或工作目录)就可能发生相互干扰,导致结果不可预期。因此,当需要避免并行执行时,可以通过下述方式将测试改为单线程串行运行:

cargo test -- --test-threads=1

--test-threads 参数告诉测试运行器使用多少个线程来并行执行测试。将其设置为 1 即可让所有测试顺序地依次运行,杜绝并行冲突。如果项目中仅有一部分测试彼此存在冲突,也可以通过其他方式隔离它们(比如让测试使用不同的临时文件名、路径等),继续保持其它测试并行执行,从而在准确性与速度之间取得平衡。

二、查看测试输出

Rust 的测试运行器默认会“捕获”通过 println! 等方式打印到标准输出的内容。也就是说,如果测试通过了,你通常不会看到这些输出。如果你希望在测试通过时也能看到打印结果,只需在执行测试时添加 --show-output

cargo test -- --show-output

这样就算测试通过,也能在终端看到输出的所有内容。如果你没有使用此参数,那么只有在测试失败时,运行器才会把测试产生的输出打印到屏幕,方便你进行排查。

举个例子,下面是一段带有输出的示例测试:

fn prints_value(x: i32) -> i32 {println!("I got the value {}", x);10
}#[cfg(test)]
mod tests {use super::*;#[test]fn test_pass() {assert_eq!(prints_value(4), 10);}#[test]fn test_fail() {assert_eq!(prints_value(8), 8);}
}
  • 不加 --show-output:你只会在失败的测试中看到输出,比如“I got the value 8”。
  • --show-output:你能同时看到成功和失败的测试输出,包含“I got the value 4”和“I got the value 8”。

三、按名称筛选要运行的测试

在大型项目中,我们可能并不想每次都运行全部测试。cargo test 允许你通过传递测试名称或其一部分来筛选只运行部分测试。

1. 运行单个测试

假设我们有如下三个测试函数:

#[cfg(test)]
mod tests {use super::*;#[test]fn add_two_and_five() {assert_eq!(add_two(5), 7);}#[test]fn add_two_and_one_hundred() {assert_eq!(add_two(100), 102);}#[test]fn add_two_and_negative() {assert_eq!(add_two(-2), 0);}
}

如果只想运行 add_two_and_five 测试,可以执行:

cargo test add_two_and_five

它会精确匹配测试函数名(或包含该字符串的测试名),因此只运行 add_two_and_five,而跳过其它测试。

2. 模糊匹配运行多个测试

当你只指定了部分字符串(例如 add_two),那么所有函数名包含该子串的测试都会被执行:

cargo test add_two

这样就能一次性跑 add_two_and_fiveadd_two_and_one_hundredadd_two_and_negative 三个测试。对于模块名也同理,如果模块名中包含了指定子串,也会匹配该模块下所有测试。

四、忽略某些测试

有些测试用例可能相当耗时(例如需要访问网络或执行性能基准),并且在日常开发阶段你并不希望每次都运行它们。可以在对应的测试函数上添加 #[ignore],这样执行 cargo test 时会默认跳过它们:

#[test]
#[ignore]
fn expensive_test() {// 可能做一些庞大运算或网络操作
}

执行时,你会看到类似以下结果:

running 1 test
test expensive_test ... ignored

1. 运行被忽略的测试

如果需要只运行或包括忽略测试,有以下两种方式:

  • 只运行被忽略的测试
    cargo test -- --ignored
    
  • 运行所有测试(包含被忽略的)
    cargo test -- --include-ignored
    

如此便可在不同场景下快速切换测试范围,节省时间又保证在需要的时候验证所有功能。

五、结语

Rust 的测试生态既简单又强大,默认为你并行执行测试并捕获输出,让结果更易读。但在实际开发中,往往需要对执行流程进行微调,例如:

  1. 调整并行度:避免共享资源冲突或提升执行效率。
  2. 查看完整输出:方便调试,即使测试通过也能看到关键性日志。
  3. 按名称过滤测试:加快反馈速度,聚焦当前工作范围。
  4. 忽略特定测试:在常规开发中跳过耗时场景,之后再做专项验证。

通过结合 cargo test 提供的命令行参数以及对测试函数进行适当标注,开发者可以轻松地兼顾测试执行的灵活性与可维护性。随着项目规模的不断扩大,这些技巧将大大提升你的日常调试与验证效率。

希望本篇能够帮助你更好地掌控 Rust 测试的执行方式,写出更严谨、稳定的代码!Happy Testing!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15561.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《LeetCode Hot100》 Day01

Day01 轮转数组 思路: (1) 使用O(1) 空间复杂度解决,就需要原地解决,不能创建新的数组。 (2) 先整体反转数组,再反转前k个数,再反转剩下的数。即可完整本题。 &…

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…

【网络安全】服务器安装Docker及拉取镜像教程

文章目录 1. 安装 Docker2. 拉取镜像3. 运行 Ubuntu 容器4. 执行相关操作5. 退出并停止容器1. 安装 Docker # 更新软件包索引 sudo apt update# 安装必要的依赖 sudo apt install -y ca-certificates curl gnupg

Python应用指南:一个库解决常见的国内坐标系转换需求

在地理信息系统(GIS)和位置服务开发中,坐标转换是一项基础且至关重要的任务,不同坐标系统间的精确转换对于确保地图显示的准确性和提升基于地理位置的服务质量至关重要。coord-convert 库专为解决这一系列坐标转换问题而设计&…

win32汇编环境,对线程的创建与操作示例一

;运行效果 ;win32汇编环境,对线程的创建与操作示例一 ;线程是主进程之外并行运行着的过程,很多的时候,我们需要一些运算保持运行,但又不能影响进程,这个时候就需要线程 ;比如,在游戏外挂之中,需要每隔几秒判…

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤: 利用 DeepSeek 生成 PPT 内容: 访问 DeepSeek 官网,完成注册/登录后进入对话界面。输入指令,例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲,需包…

学习总结二十九

公路维修问题 这里首先先明白题意,就是一段路分为m段,只需要分m-1次。我们先要解决的的问题是如何在合适的地方截断。案例给出,发现第一段的末与第二段的头的位置相差很大,而每一段的每个坑位相差不是很大 。,所以就知…

C语言预处理艺术:编译前的魔法之旅

,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、预处理的作用与流程(1&…

【go】交叉编译

发现go像是c,做后台还是比较好的 使用的是goland编辑器,可以在windows编译在linux上运行,配置如下: Goland中导入包标红但是能用解决办法 复制了一份项目代码task为task_bk,但是原来的task删除了,再次 把t…

防御综合实验

需求一 配置vlan [SW2]int g 0/0/2 [SW2-GigabitEthernet0/0/2]port link-type access [SW2-GigabitEthernet0/0/2]port default vlan 10 [SW2-GigabitEthernet0/0/2]int g0/0/3 [SW2-GigabitEthernet0/0/3]port link-type access [SW2-GigabitEthernet0/0/3]port default vl…

数据库高安全—数据保护:数据动态脱敏

书接上文数据库高安全—审计追踪:传统审计&统一审计,从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读,本篇将从数据动态脱敏方面对高斯数据库的数据保护技术进行解读。 5.1 数据动态脱敏 数据脱敏,顾名思义就…

《艾尔登法环》运行时弹窗“由于找不到vcruntime140.dll,无法继续执行代码”要怎么解决?

宝子们,是不是在玩《艾尔登法环》的时候,突然弹出一个提示:“由于找不到vcruntime140.dll,无法继续执行代码”?这可真是让人着急上火!别慌,今天就给大家唠唠这个文件为啥会丢,还有怎…

【Git】Failed to connect to github.com port 443: Timed out

由于DNS污染国内访问github经常会超时,参考网上的方法修改host文件绑定ip过段时间就失效了,这里介绍一个修改工具,通过修改本地host来绕过国内DNS解析实现连接 UsbEAm Hosts Editor UsbEAm Hosts Editor [多平台hosts修改] V3.63 – Dogfigh…

qml RoundButton详解

1、概述 RoundButton是QML(Qt Modeling Language)中的一种按钮控件,它继承自Button控件,并增加了一个特殊的属性——radius,用于设置按钮圆角的半径。这使得RoundButton能够呈现为带有圆角的形状,而不仅仅…

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹,作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时,django-admin.exe安装的位置,例如 4.运行命令 使用django-admin.exe的绝对路径,在刚才打开的终端…

Visual Studio 2022 中使用 Google Test

要在 Visual Studio 2022 中使用 Google Test (gtest),可以按照以下步骤进行: 安装 Google Test:确保你已经安装了 Google Test。如果没有安装,可以通过 Visual Studio Installer 安装。在安装程序中,找到并选择 Googl…

Unity-Mirror网络框架-从入门到精通之LagCompensation示例

文章目录 前言什么是滞后补偿Lag Compensation示例延迟补偿原理ServerCubeClientCubeCapture2DSnapshot3D补充LagCompensation.cs 独立算法滞后补偿器组件注意:算法最小示例前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mir…

数据集成实例分享:金蝶云星空对接旺店通实现库存管理自动化

拆卸父项出库:金蝶云星空数据集成到旺店通企业奇门 在现代企业的运营过程中,数据的高效流动和准确处理至关重要。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将金蝶云星空的数据无缝对接到旺店通企业奇门&#xff0…

Git、Github和Gitee完整讲解:丛基础到进阶功能

第一部分:Git 是什么? 比喻:Git就像是一本“时光机日记本” 每一段代码的改动,Git都会帮你记录下来,像是在写日记。如果出现问题或者想查看之前的版本,Git可以带你“穿越回过去”,找到任意时间…

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…