写点什么

mockrs: 重新定义 Rust 测试——业界首个线程安全的自由函数模拟库

作者:SkyFire

你是否曾为了测试一个简单的自由函数,而被迫重构代码、引入不必要的 Trait 和复杂的依赖注入?你是否因无法模拟 FFI 或外部依赖的具体实现而头痛不已?你是否在并行测试中,因全局 Mock 状态污染而导致测试结果不稳定?

现在,这一切将成为历史。隆重介绍 mockrs——一个革命性的 Rust 模拟库,它将把你从传统测试的枷锁中解放出来。

告别 Trait 约束,拥抱无限可能

传统的 Rust 模拟库(如 mockall)功能强大,但它们几乎都构建在 Trait 之上。这意味着,为了可测试性,你必须:

  • 将自由函数封装成 Trait 方法。

  • 为具体实现抽象出接口。

  • 在整个代码库中传递泛型约束和依赖注入。

这种“为测试而设计”的模式不仅增加了巨大的重构成本,还限制了你的设计自由,尤其是在处理既有代码、FFI 或第三方库时,往往束手无策。


mockrs 另辟蹊径,它不在类型系统层面做文章,而是深入底层,在运行时直接对函数入口的机器码进行“外科手术式”的修改。通过将函数的第一条指令替换为陷阱指令,mockrs 可以在任何代码执行到该函数时将其拦截,实现对任意函数的模拟——无论是自由函数、具体方法,还是 FFI 调用,都无需修改一行生产代码。

核心亮点:业界唯一的线程级隔离

mockrs 最具革命性的特性,是其业界独一无二的线程安全模拟机制


在传统的 C/C++ 打桩或一些全局 Mock 方案中(如 mockcpp),一旦一个函数被替换,整个进程内的所有线程都会受到影响。这在并发测试中是一场噩梦,不同测试用例间的状态会相互“污染”,导致测试脆弱、不可靠,甚至逼迫你放弃并行测试,严重拖慢 CI/CD 流程。


mockrs 完美地解决了这个问题。它通过巧妙地结合信号处理与线程本地存储(TLS),实现了精确到线程的模拟作用域:


  • 当你在线程 A 中为一个函数 f() 设置了模拟,只有线程 A 在调用 f() 时会执行模拟逻辑。

  • 与此同时,线程 B、C、D… 即使也在调用同一个函数 f(),它们将完全不受影响,继续执行原始、真实的代码逻辑。

  • 甚至在 B、C、D 中还可以对相同的函数进行不同的模拟,模拟效果互相隔离。

这意味着你可以放心地在多个线程中并行运行不同的测试场景,即使它们模拟的是同一个目标函数,也绝不会相互干扰。这是真正意义上的并发安全测试,为复杂的多线程应用集成测试提供了前所未有的稳定性和效率。

mockrs 的核心优势

  • 零侵入性:无需为可测试性而重构生产代码。保持你的设计纯粹、简洁。

  • 万物皆可模拟:轻松模拟自由函数、具体方法、FFI 接口,覆盖传统工具的测试盲区。

  • 真正的线程隔离:业界首个支持自由函数线程级 Hook 的模拟库,让并行测试安全、可靠、高效。

  • 简洁的 API:通过一个 mock! 宏即可完成所有操作,结合 RAII 设计,作用域结束自动恢复,安全无副作用。

  • 跨架构支持:已在 x86_64 与 aarch64 架构上经过验证,保障工程可用性。

快速上手

体验 mockrs 的强大从未如此简单:


use mockrs::mock;
// 你的生产代码,无需任何改动fn get_user_id() -> u64 { // ... 复杂的数据库或网络调用 42}
#[test]fn test_user_logic_with_mock() { assert_eq!(get_user_id(), 42); // 模拟函数 fn return_100() -> u64 { 100 }
// 在当前测试线程中,将 get_user_id 替换为返回 100 let _mocker = mock!(get_user_id, return_100);
// 调用时将命中模拟实现 assert_eq!(get_user_id(), 100);
// _mocker 离开作用域,模拟自动恢复,提前恢复可以手动 drop 掉_mocker}
// 在另一个并行测试中,get_user_id 依然是 42#[test]fn test_user_logic() { // 可安全并发测试 assert_eq!(get_user_id(), 42);}
复制代码


结论

mockrs 不仅仅是一个新的模拟库,它代表了一种全新的测试哲学:测试应该服务于代码,而不是绑架代码。通过其创新的运行时挂钩技术和独家的线程安全设计,mockrs 为 Rust 社区提供了一个强大、灵活且无侵入的测试解决方案,特别是在集成测试、遗留代码维护和复杂并发系统验证等领域,它将成为你不可或缺的利器。

是时候打破常规,体验真正的测试自由了。

https://github.com/skyfireitdiy/mockrs

发布于: 刚刚阅读数: 6
用户头像

SkyFire

关注

这个cpper很懒,什么都没留下 2018-10-13 加入

会一点点cpp的苦逼码农

评论

发布
暂无评论
mockrs: 重新定义 Rust 测试——业界首个线程安全的自由函数模拟库_rust_SkyFire_InfoQ写作社区