【Rust自学】11.10. 集成测试
11.10 集成测试11.10.1. 什么是集成测试在Rust里集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样这也意味着它们只能调用公共API。集成测试的目的是验证库的多个部分能否正确地一起工作。这一点有别于单元测试单元测试比较小也比较专注。单元测试单独测试一个模块还可以测试私有接口。有时单独运行没问题的代码合在一起使用时仍可能出问题。集成测试正是为了尽早发现并解决这类问题而存在的。因此集成测试的覆盖率很重要。11.10.2.tests目录要创建集成测试首先创建tests目录。这个目录与src并列cargo会自动在那里寻找集成测试文件。你可以在这个目录下创建任意数量的集成测试文件。编译时cargo会把每个测试文件当作一个单独的包也就是一个单独的crate。下面演示如何创建集成测试文件1. 创建tests目录在src旁边创建一个名为tests的文件夹2. 创建测试文件在tests下创建一个.rs测试文件并给它取名。这里我用的是integration_test.rs3. 把测试代码移到测试文件里以 11.9. 单元测试 的代码为例lib.rspub fn add_two(a: usize) - usize { internal_adder(a, 2) } fn internal_adder(left: usize, right: usize) - usize { left right } #[cfg(test)] mod tests { use super::*; #[test] fn internal() { let result internal_adder(2, 2); assert_eq!(result, 4); } }因为每个集成测试文件都是一个单独的crate所以这个文件integration_test.rs如果想测试那个crate就必须先把lib.rs的内容导入作用域。在这个例子中由于我把项目命名为RustStudy所以包名也是RustStudy。如果不清楚可以到Cargo.toml里看name字段。在这个例子中可以写use RustStudy;来导入如果想导入某个具体函数也可以。导入之后可以直接写测试函数。不需要写#[cfg(test)]因为tests目录下的代码只有在执行cargo test时才会运行。只需要给测试函数标注#[test]即可。完整代码如下integration_test.rsuse RustStudy; #[test] fn it_adds_two() { let result RustStudy::add_two(2); assert_eq!(result, 4); }输出$ cargo test Compiling RustStudy v0.1.0 (file:///projects/RustStudy) Finished test profile [unoptimized debuginfo] target(s) in 0.15s Running unittests src/lib.rs (target/debug/deps/RustStudy-48a2c23cb22e1ddc) running 1 test test tests::internal ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/integration_test.rs (target/debug/deps/integration_test-e60608d740742c0c) running 1 test test it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests RustStudy running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s可以看到这个输出显示运行了两个测试一个来自lib.rs单元测试一个来自integration_test.rs集成测试。11.10.3. 运行指定的集成测试要运行某个特定的集成测试函数使用cargo test test_name。要运行某个测试文件中的所有测试函数使用cargo test --test file_name。看个例子现在tests下有两个文件。如果我只想运行integration_test.rs里的测试函数可以运行cargo test --test integration_test11.10.4. 集成测试中的子模块因为tests下的每个文件都被编译成单独的crate所以这些文件彼此不共享行为这与src下的文件不同。那么如果想把测试函数中重复的逻辑提取到一个helper函数里以避免重复该怎么写呢例如我在tests下创建了common.rs来存放helper函数试着运行测试$ cargo test Compiling RustStudy v0.1.0 (file:///projects/RustStudy) Finished test profile [unoptimized debuginfo] target(s) in 0.13s Running unittests src/lib.rs (target/debug/deps/RustStudy-48a2c23cb22e1ddc) running 1 test test tests::internal ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/common.rs (target/debug/deps/common-5306c3915df25199) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/integration_test.rs (target/debug/deps/integration_test-e60608d740742c0c) running 1 test test it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests RustStudy running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s可以看到common.rs出现在了测试输出中。但因为common.rs只是用来存放helper函数的它本身不需要被测试。这种写法是错误的。正确做法是在tests下创建common目录在里面放一个mod.rs文件并把helper函数移过去然后删除原来的common.rs这是Rust能理解的另一种命名约定。Rust不会把common模块当作集成测试文件测试输出中也不会再出现common因为tests下的子目录不会被编译成单独的crate。如果要在集成测试文件中使用那里的内容只需在文件开头写mod folder_name;。在这个例子中就是mod common;。使用时写common::your_function。在这个例子中就是common::setup()。11.10.5. 针对二进制crate的集成测试如果项目是二进制crate也就是只有src/main.rs而没有src/lib.rs就不能在tests下创建集成测试即使创建了也无法把main.rs里的函数导入作用域。因为只有库crate也就是有lib.rs的才能把函数暴露给其他crate使用。二进制crate意味着独立运行。因此Rust的二进制项目通常会把这些逻辑放在lib.rs里而在main.rs里只保留简单调用。这样项目就会被视为库crate就可以用集成测试来检查代码。

相关新闻

FlexRay通信控制器中断寄存器配置与应用实战指南

FlexRay通信控制器中断寄存器配置与应用实战指南

1. 项目概述与中断机制的核心价值在嵌入式系统,尤其是汽车电子和工业控制领域,实时性和可靠性不是锦上添花,而是生死攸关的底线。想象一下,一辆高速行驶的汽车,其引擎控制单元(ECU)需要毫秒级响…

2026/10/18 10:40:02 阅读更多 →
V2G微电网多目标优化调度与改进灰狼算法研究

V2G微电网多目标优化调度与改进灰狼算法研究

1. 项目概述在新能源电力系统快速发展的背景下,微电网作为整合分布式能源的重要载体,其优化调度问题日益受到关注。本项目针对含风、光、荷、储的微电网系统,引入V2G(Vehicle-to-Grid)技术,提出了一种改进的…

2026/10/18 10:40:43 阅读更多 →
2026国内满意度调研机构权威排行榜 数据采集与本地化服务领跑者

2026国内满意度调研机构权威排行榜 数据采集与本地化服务领跑者

本榜单评选国内头部满意度调研机构前十,筛选标准包括数据采集能力、本地化服务网络、样本质量与方法学严谨度,并附5大高精度研究方法与数据驱动决策深度解析。引言:评估维度与方法选择说明我们以多维指标构建权威评估框架,兼顾现实…

2026/10/18 10:40:51 阅读更多 →

最新新闻

SELinux文件系统标签管理与审计日志联调排查实战指南

SELinux文件系统标签管理与审计日志联调排查实战指南

干了这么多年Linux运维,我见过太多人碰到SELinux就是一套组合拳:先setenforce 0,再改/etc/selinux/config,直接把安全机制摁死。这路子确实省事,但要是服务器被日穿了,连个审计线索都捞不着,那时…

2026/10/19 22:06:39 阅读更多 →
Android国密SM2/SM3/SM4轻量级生产级封装工具包

Android国密SM2/SM3/SM4轻量级生产级封装工具包

简介:本资源是一套面向Android开发者的国密算法实战封装库,聚焦SM2非对称加密、SM3密码杂凑与SM4对称分组加密三大核心算法,解决国产密码在移动端集成难、兼容性差、调用接口不统一等实际问题,适用于金融类App、政务平台、物联网终…

2026/10/19 22:06:39 阅读更多 →
diagram-design:从草图到系统,图表设计规范与工程实践

diagram-design:从草图到系统,图表设计规范与工程实践

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到“diagram-design”这个词,很多人会下意识觉得它只是“画图”的另一种说法。但真正在项目里被图表折磨过的人都知道,画一张图不难,难的是让这张图在三个月后…

2026/10/19 22:06:39 阅读更多 →
美赛B题O奖论文拆解:概率搜索模型与路径规划实战

美赛B题O奖论文拆解:概率搜索模型与路径规划实战

去年美赛B题一出,圈子里都在讨论那篇O奖论文。英文原题翻译成中文,核心是四个字:失联寻回。那篇O奖论文的标题如果直译,大概就是《从失联到寻回:某片海域的搜寻之旅》。我刻意不提具体海域名,因为做案例分析…

2026/10/19 22:05:38 阅读更多 →
多测站GNSS精密定位:Kriging插值与卡尔曼滤波实现网络RTK

多测站GNSS精密定位:Kriging插值与卡尔曼滤波实现网络RTK

很多人第一次看到“多测站 GNSS 精密定位 Kriging 卡尔曼滤波”这条链路时,第一反应都是:有必要这么复杂吗?单站差分、PPK、PPP不也能定位吗。我之前做某测试场的动态定位精度评估时也这么想,直到某次基准站距离用户站超过30km&…

2026/10/19 22:05:38 阅读更多 →
IM系统用户管理子服务架构设计与踩坑实践:从表结构到缓存策略

IM系统用户管理子服务架构设计与踩坑实践:从表结构到缓存策略

做IM系统,用户管理子服务往往是看起来最简单、坑却最多的那一块。很多人一开始会觉得,无非就是注册、登录、改个昵称、拉个好友列表,有什么好写的?但真正上手做才发现,一个IM系统里最基础的用户服务,牵扯到…

2026/10/19 22:03:35 阅读更多 →

日新闻

频率跟踪型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/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

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

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

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

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →