Rust项目测试提效:cargo-nextest实践指南
免责声明:本文由人工智能写作和交流助手辅助创作。在它的帮助下,我们将这场内容丰富且细腻的直播的核心议题提炼成了精简的博客文章。
在最近的 JetBrains 直播中,Vitaly Bragilevsky 邀请了 cargo-nextest 的创作者 Rain,共同探讨了 Rust 测试、开发者工具、开源维护以及大型 Rust 项目中日常开发体验等话题。
cargo-nextest 作为下一代测试运行器,在 Rust 生态系统中得到了广泛应用。它的设计初衷是让 Rust 测试执行更快、更具可观测性且更可靠,特别适用于大型代码库、CI 流水线以及包含复杂集成测试的项目。
对于 RustRover 用户来说,这次交流恰逢其时。RustRover 2026.1 引入了对 cargo-nextest 的原生支持,开发者现在可以直接在 IDE 中运行和监控 nextest 会话,并在“测试”工具窗口中查看进度报告和结构化的结果。
如果你错过了直播,可以在 JetBrains TV 上观看完整录像。以下是本次会议关键问题与见解的结构化回顾。
Q1. Rain 是谁?他们是如何接触到 Rust 的?
Rain 是一位拥有超过十年行业经验的软件工程师。他们的 Rust 之旅始于 2017 年,当时在 Meta 从事源代码控制基础设施工作。Rain 加入了一个用 Rust 构建 Mercurial 服务器的项目。团队中已经有人具备 Rust 专业知识,而 Rain 则带来了 Mercurial 的深厚背景。那次合作成为了他们进入 Rust 世界的敲门砖。
“我为了做这个项目而学习 Rust。在开发过程中,我爱上了 Rust,并决定深入钻研。”
他们曾在 Mozilla、Meta 工作,目前就职于 Oxide Computer Company,在那里,Rust 被应用于从嵌入式固件到高级控制平面软件的整个技术栈中。
Q2. 什么是 cargo-nextest?
从宏观层面看,它旨在让 Rust 测试运行得更快,并让开发者能更好地洞察测试过程。在基准测试中,根据项目和工作负载的不同,cargo-nextest 的速度最高可比 cargo test 快三倍。
cargo-nextest 还包含了随着项目增长而变得愈发重要的功能。正是这种特性组合,使得 cargo-nextest 在开源项目和大型工业级代码库中都非常有用。
“cargo-nextest 非常关注 CI,但同时也十分重视本地交互式的开发者体验。”
Q3. cargo-nextest 解决了什么问题?
Rain 明确表示,cargo test 仍然是一个优秀的工具,特别是在测试核心算法、数据结构和小型项目时。当 Rust 项目发展为大型服务、大型 CLI 应用程序或包含大量集成和端到端测试的代码库时,其局限性就会显现出来。
在这种情况下,主要问题不仅是“测试运行得有多快”,还包括:
- 哪些测试运行缓慢?
- 哪些测试不稳定(flaky)?
- CI 中到底发生了什么?
cargo-nextest 正是为这种环境而生的。
“nextest 解决的最大问题是大型网络服务测试套件的速度和可观测性。”
Q4. 什么时候应该从 cargo test 切换到 cargo-nextest?
如果你对 cargo test 很满意,则不必切换。但如果你对测试体验的某些方面感到不满,那么 cargo-nextest 非常值得一试。
他们指出了三个常见的信号:
- 测试不稳定(Flaky tests):cargo-nextest 可以重试测试,这有助于区分持续失败和偶发性的不稳定失败。
- 测试隔离:cargo-nextest 在各自的进程中运行每个测试。这对于依赖全局状态、外部 API、图形上下文或其他在测试间复用时表现不佳的资源的测试非常重要。
- 速度:对于大型服务和更大的测试套件,cargo-nextest 通常比
cargo test快几倍。这既能节省本地开发时间,也能节省 CI 计算资源。
“如果你对 cargo test 的速度感到不满,我强烈建议你尝试一下 cargo-nextest。”
Q5. cargo-nextest 最酷的功能是什么?
通过运行记录(run recording),cargo-nextest 可以捕获测试运行期间发生的情况,包括在 CI 中。开发者随后可以在本地获取该运行记录,检查每个测试的操作,从而更好地理解在自己机器之外发生的失败。
第二个是 Perfetto 追踪输出。cargo-nextest 可以生成可由 Perfetto 打开的追踪数据,为开发者提供测试执行的图形化视图。
“你可以获得关于测试执行的所有可观测性数据,我认为这非常强大。”
Q6. 有什么鲜为人知但值得了解的功能?
当开发者使用 cargo test 调试测试时,往往会直接运行测试二进制文件。问题在于 Cargo 通常会设置围绕测试执行的环境变量和配置。
cargo-nextest 的调试器支持通过配置环境来解决这个问题,使得测试在调试器中运行的方式与正常执行完全一致。
“你在调试器中能获得完全相同的环境。”
对于需要逐步调试单个失败测试的开发者来说,这可能意味着在追踪误导性的本地复现方案与真正调试出故障原因之间的区别。
Q7. cargo-nextest 如何帮助处理卡住或长时间运行的测试?
cargo-nextest 允许你导出当前正在运行的测试信息。在任何操作系统上,你都可以按 T 键;在 macOS 上,你也可以通过 SIGINFO 使用 Control-T。这为你提供了测试运行时间的实时视图,以及标准输出(stdout)和标准错误(stderr)输出。
这对于调试仅在更大规模运行上下文中出现的复杂故障特别有用。
Q8. 构建 cargo-nextest 最困难的部分是什么?
测试运行器不仅要启动进程并等待结果,它还必须观察发生的情况,处理成功、失败、异常终止、超时、重试、输出捕获、调度等。随着新功能的增加,状态机变得越来越复杂。
有趣的是,cargo-nextest 并非典型的“每秒处理千万级请求”的异步用例。它通常只运行与 CPU 核心数或线程数相当的测试数量。但状态机本身很复杂,而异步 Rust 提供了一种结构化的方式来管理这种复杂性。
“用于管理测试的状态机极其复杂,能够用异步 Rust 来表达它是非常强大的。”
Q9. 如果能回到 2017 年,Rain 会对 Rust 做什么改变?
异步 Rust 很强大,但它也引入了一些在同步 Rust 中并不存在的“坑”。Rust 的安全模型是吸引他们使用该语言的原因之一,特别是在线程安全、别名和可变性方面。异步 Rust 保留了许多这些优势,但取消和清理逻辑可能难以推理。
“我充满希望,但现在的实现难度确实比 2017 年要大。”
Q10. cargo-nextest 可扩展吗?
是的,这也是它能够与其他工具集成的核心原因之一。
cargo-nextest 提供了机器可读的输出格式和扩展点,其他工具可以在此基础上进行构建。它还支持设置脚本(setup scripts)等功能,可以在测试运行前准备数据库、植入测试数据或配置环境。
Q11. cargo-nextest 对嵌入式 Rust 有用吗?
cargo-nextest 本身可能无法在嵌入式硬件上运行,因为它相当复杂。但它仍然可以帮助处理测试被分发到真实硬件上的嵌入式测试工作流程。
一个相关的功能是包装脚本(wrapper scripts)。cargo-nextest 可以通过运行一个脚本来执行测试,而不是直接运行测试。该脚本可以配置环境、向硬件发送指令或与目标运行器协调。
Q12. 什么才算是一个好的开发者工具?
对于 Rain 来说,一个好的开发者工具必须正确且可靠,尤其是在出现问题时。
对于测试运行器而言,这意味着处理的内容必须超出“理想路径”。测试可能会失败、超时、崩溃、产生段错误、产生输出,或者根据环境表现出不同的行为。一个好的工具需要清晰地呈现所有这些信息。
“总目标不是尽可能多地自动化,而是服务好你的客户。”
这一原则不仅适用于测试运行器,也适用于其他领域。一个好的开发者工具不是试图将开发者从工作中剥离,而是帮助他们更有信心地完成工作。
Q13. Rain 推荐哪些 Rust 工具?
Rain 提到了三个:
- cargo-hack:适用于具有多种功能(feature)组合的包。它可以在不同的功能集上运行测试,并根据功能间的依赖关系优化组合。
- cargo-expand:在开发宏或过程宏时很有用,因为它能显示展开后的输出。
- cargo-semver-checks:对于包维护者非常有用,因为它可以检测语义化版本(semver)兼容性问题,包括简单的 API 变更以及更隐蔽的变更(如意外移除 Send 或 Sync 约束)。
优秀的 Rust 工具能帮助开发者理解代码在做什么、发生了什么变化,以及可能导致什么中断。
RustRover 中的 cargo-nextest
RustRover 2026.1 增加了直接在 IDE 中对 cargo-nextest 的原生支持。对于 Rust 开发者来说,这意味着你可以在不离开日常开发工作流的情况下运行和监控 nextest 会话。
你无需切换到终端阅读原始输出,而是在“测试”工具窗口中获得结构化的测试结果和进度报告。
我们的目标不是取代那些偏好终端的开发者的习惯,而是为那些已经依赖 cargo-nextest 并希望在 IDE 中集成相同工作流的团队和开发者降低摩擦。
结语
随着 Rust 项目的增长,测试已成为团队理解正确性、性能和信心保障的重要组成部分。
cargo-nextest 有助于使测试运行更快、隔离性更好、可观测性更强,且更易于调试。
如果你感兴趣:
如果你正在处理缓慢的测试运行、不稳定的测试或复杂的 CI 失败,cargo-nextest 非常值得探索。