【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就可以用集成测试来检查代码。

相关新闻

PSO-XGBoost组合模型在工业预测中的优化与应用

PSO-XGBoost组合模型在工业预测中的优化与应用

1. 项目概述:当粒子群优化遇上XGBoost在工业预测和数据分析领域,我们常常需要处理复杂的非线性关系。传统单一算法往往难以兼顾预测精度和可解释性,这正是PSO-XGBoost组合模型大显身手的地方。这个项目完整实现了从参数优化到结果解释的全流程…

2026/7/23 18:55:03阅读更多 →
西平装修亲测:2026年7月选这家省心

西平装修亲测:2026年7月选这家省心

2026年,西平全屋定制市场仍面临三大核心挑战:效率低下、成本失控、效果难控。据行业数据显示,73%的业主在装修过程中需要对接至少4个不同服务方(设计师、施工队、建材商、家具商),平均耗时超6个月&#xff…

2026/7/23 18:55:03阅读更多 →
【JAVA毕设源码分享】基于springboot大学生就业招聘系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot大学生就业招聘系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

2026/7/23 18:55:03阅读更多 →
从标准SPI到MibSPI:多缓冲与自动触发如何提升嵌入式通信效率

从标准SPI到MibSPI:多缓冲与自动触发如何提升嵌入式通信效率

1. 项目概述:从标准SPI到MibSPI的演进在嵌入式系统开发中,串行外设接口(SPI)几乎是工程师们最熟悉的老朋友之一。它简单、直接,一个时钟线、两根数据线,加上片选,就能让主控芯片和传感器、存储器…

2026/7/23 20:19:30阅读更多 →
HarmonyOS 无障碍体验实战:朗读标签、焦点顺序与高对比模式

HarmonyOS 无障碍体验实战:朗读标签、焦点顺序与高对比模式

HarmonyOS 无障碍体验实战:朗读标签、焦点顺序与高对比模式 无障碍不是最后补几个标签。读屏用户能不能理解按钮含义,键盘或辅助设备能不能按正确顺序移动焦点,高对比模式下文字是否仍然可读,都会决定用户能否完成任务。本文用一个…

2026/7/23 20:19:30阅读更多 →
【Linux系统编程】进程控制(一)——进程创建与进程终止

【Linux系统编程】进程控制(一)——进程创建与进程终止

文章目录1. 进程创建1.1 fork系统调用1.2 写时拷贝1.3 fork常规用法1.4 fork调用失败的原因2. 进程终止2.1 进程终止的场景2.2 进程常见的退出方法2.2.1 return 退出退出码2.2.2 exitreturn方式 vs 函数exit2.2.3 _exitexit函数 vs 系统调用_exit缓冲区在哪里呢?本节…

2026/7/23 20:19:30阅读更多 →
ICM创芯微 CM1002-C SOT23-6 BMS电池保护芯片

ICM创芯微 CM1002-C SOT23-6 BMS电池保护芯片

特性 高精度电压检测功能 过充电保护电压 3.500V ~ 4.600V,精度 25mV 过充电解除电压 3.100V ~ 4.600V,精度 45mV 过放电保护电压 2.000V ~ 3.400V,精度 50mV 过放电解除电压 2.000V ~ 3.400V,精度 100mV 放电过流保护电压 0.015V…

2026/7/23 20:19:30阅读更多 →
MibSPI寄存器配置全解析:从引脚控制到多缓冲传输实战

MibSPI寄存器配置全解析:从引脚控制到多缓冲传输实战

1. MibSPI控制寄存器概览与设计哲学在嵌入式开发,尤其是汽车电子和工业控制领域,德州仪器的MibSPI模块因其多缓冲架构和并行引脚选项而备受青睐。但很多工程师在初次接触其寄存器手册时,往往会感到困惑:为什么一个SPI模块需要多达…

2026/7/23 20:19:30阅读更多 →
出海AI企业搭建算力基础设施,要满足哪些核心性能要求?

出海AI企业搭建算力基础设施,要满足哪些核心性能要求?

算力出海这件事,前前后后帮客户做了几十次,最关键的底线其实就四条:GPU算力密度、跨区域网络延迟、存储吞吐带宽、安全合规。不同阶段要求不一样,选错直接拉高成本还拖工期。一、AI算力出海,性能瓶颈通常卡在哪大部分问…

2026/7/23 20:17:30阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/23 0:56:31阅读更多 →
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:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

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

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

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →