如果你在开发大型项目,那么你该使用 nextest 了
文章目录
如果你在开发大型项目,那么你该使用 nextest 了
平常写小项目的话,使用 cargo test 是足够的,但是对于大型项目来说,cargo test 在测试效率上会成为瓶颈。这篇文章会讲下业界内主流的替代方案:nextest,很多大型开源项目都在使用它,如 tokio、uv、codex 等都在使用它。
更快的秘密
默认情况下,cargo test 采用下图中所示的执行模型:

在这个模型中,先为每个 crate 构建一个测试二进制文件,再由该二进制文件串行执行其内部所有测试用例。这种模式存在三大痛点:
- 并行粒度粗:仅能按 crate 级别并行,无法实现测试用例级别的并行,多核 CPU 资源利用率低;
- 测试隔离弱:同一二进制内的测试用例共享进程空间,变量、资源泄漏会导致测试用例相互干扰,可能会出现偶发失败;
- 效率瓶颈明显:单个测试用例卡住会阻塞整个 crate 的测试,大型项目测试耗时冗长。
每个测试二进制文件会串行运行,而二进制文件则负责并行执行各个测试。可以说是非常中规中矩的实现。
而 nextest 采用了一种截然不同的执行模型:

Nextest 创新性地采用测试用例级进程隔离模型,一次 nextest 运行包含两个独立阶段:列表阶段(List Phase)和运行阶段(Run Phase):
- 列表阶段:nextest 先编译生成所有项目测试二进制文件,批量扫描提取全部测试用例元数据并建立统一索引清单,为后续精细化并行调度打好前置基础。
- 运行阶段:nextest 按 会进行智能调度,为每个测试用例单独分配独立进程并行执行,全程实时监控运行状态、自动处理重试与泄漏检测,执行完毕后统一汇总分类输出各类测试结果。
简单理解就是,比 cargo test 更加细粒度、更加并行化、更加智能化。
安装 nextest
推荐通过 cargo install 全局安装,适用于所有的 Rust 环境:
cargo install cargo-nextest --locked
基础使用
Nextest 完全兼容 cargo test 的大部分参数,同时提供更丰富的扩展命令,以下是日常开发中最常用的操作:
运行所有测试
在 Rust 项目根目录执行,自动构建测试二进制并运行所有测试用例:
cargo nextest run
过滤测试用例
Nextest 支持多维度过滤,精准定位需要运行的测试用例,常用过滤方式如下:
# 按测试名称过滤(模糊匹配)
# 运行名称包含 "integration" 的测试
cargo nextest run integration
# 按包(crate)过滤
# 只运行 my-crate 包的测试
cargo nextest run -p my-crate
# 按模块过滤
# 运行 my_module 模块下的所有测试
cargo nextest run my_module::*
# 组合过滤
# 运行 my-crate 中名称不含 "slow" 的测试
cargo nextest run -p my-crate --filter 'not test(*slow*)'
查看所有测试用例
不执行测试,仅列出项目中所有测试用例的详细信息:
# 简单列出所有测试名称
cargo nextest list
# 显示详细信息(包含所属包、模块)
cargo nextest list --verbose
失败测试重试
对于偶发失败的测试,可配置自动重试,避免手动重新运行:
# 失败的测试自动重试2次
cargo nextest run --retries 2
高级配置
Nextest 支持通过配置文件 nextest.toml 自定义测试行为,它位于项目根目录的 .config 目录下。通过配置文件可以配置全局配置、超时、重试、缓存等功能,以下是常用配置的示例:
# 默认配置
[profile.default]
# 测试线程数,默认等于 CPU 核心数,可手动指定或使用 num-cpus
test-threads = "num-cpus"
# 失败重试次数
retries = 2
# 慢测试阈值,超过 1000ms 标记为 SLOW
slow-timeout = "1000ms"
# 测试泄漏检测:等待 500ms 后检测,泄漏标记为失败
leak-timeout = { period = "500ms", result = "fail" }
# 全局测试超时
global-timeout = "1h"
# 默认过滤:排除名称包含 "skip" 的测试
default-filter = "not test(*skip*)"
# ci 配置,通过 --profile ci 指定使用 ci 配置
[profile.ci]
# 继承 default 配置
inherits = "default"
# 失败两个测试后立即停止,节省时间
fail-fast = { max-fail = 2 }
# 慢测试严格模式:超过 3000ms 自动终止
slow-timeout = { period = "3000ms", terminate-after = 1, grace-period = "1000ms" }
完整的配置说明建议查看文档。
不支持文档测试
目前,nextest 不支持 Rust 文档测试。由于 Rust 的文档测试是通过特殊的机制处理的,nextest 目前主要专注于运行普通的单元测试和集成测试。
目前最佳的使用方案是 nextest 与 cargo test 两者结合使用:
cargo nextest run && cargo test --doc
如果你对文档测试支持的开发进度感兴趣的话,这个关注 GitHub 上的讨论。
结语
Nextest 凭借测试用例级进程隔离和智能并行调度,解决了 cargo test 在大型项目中的效率瓶颈,大幅提升了测试体验和工程化效率。由于文章篇幅问题,很多 nextest 的内容并没有涉及到,读者最好还是亲自看一遍文档。
对于 Rust 开发者而言,其实无论是小型项目的日常测试,还是大型项目的工程化测试,nextest 都是值得优先采用的工具。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)