49 个版本

0.6.1 2024 年 7 月 22 日
0.6.0 2024 年 2 月 11 日
0.6.0-rc.32024 年 1 月 18 日
0.5.22 2023 年 11 月 30 日
0.2.4 2020 年 7 月 31 日

#12 in 测试

Download history 110235/week @ 2024-05-03 120036/week @ 2024-05-10 122198/week @ 2024-05-17 121214/week @ 2024-05-24 131527/week @ 2024-05-31 138870/week @ 2024-06-07 118982/week @ 2024-06-14 125542/week @ 2024-06-21 125538/week @ 2024-06-28 128859/week @ 2024-07-05 129972/week @ 2024-07-12 135833/week @ 2024-07-19 138244/week @ 2024-07-26 134521/week @ 2024-08-02 156067/week @ 2024-08-09 137135/week @ 2024-08-16

594,113 每月下载量
用于 188 个 Crates (184 直接)

MIT/Apache

160KB
1.5K SLoC

wiremock

HTTP 模拟测试 Rust 应用程序。


wiremock 提供HTTP模拟,用于对与第三方API交互的 Rust 应用程序进行黑盒测试。

它使用请求匹配和响应模板提供 HTTP 响应的模拟。

名称 wiremock 是对 WireMock.Net 的引用,这是一个从 Java 到 .NET 的原始 Wiremock 的端口。

目录

  1. 如何安装
  2. 入门
  3. 匹配器
  4. 间谍
  5. 响应
  6. 测试隔离
  7. 运行时兼容性
  8. 效率
  9. 先验技术
  10. 未来演变
  11. 相关项目
  12. 许可

如何安装

通过编辑 Cargo.toml 文件将 wiremock 添加到您的开发依赖项

[dev-dependencies]
# ...
wiremock = "0.5"

或运行

cargo add wiremock --dev

入门

use wiremock::{MockServer, Mock, ResponseTemplate};
use wiremock::matchers::{method, path};

#[async_std::main]
async fn main() {
    // Start a background HTTP server on a random local port
    let mock_server = MockServer::start().await;

    // Arrange the behaviour of the MockServer adding a Mock:
    // when it receives a GET request on '/hello' it will respond with a 200.
    Mock::given(method("GET"))
        .and(path("/hello"))
        .respond_with(ResponseTemplate::new(200))
        // Mounting the mock on the mock server - it's now effective!
        .mount(&mock_server)
        .await;

    // If we probe the MockServer using any HTTP client it behaves as expected.
    let status = surf::get(format!("{}/hello", &mock_server.uri()))
        .await
        .unwrap()
        .status();
    assert_eq!(status.as_u16(), 200);

    // If the request doesn't match any `Mock` mounted on our `MockServer` a 404 is returned.
    let status = surf::get(format!("{}/missing", &mock_server.uri()))
        .await
        .unwrap()
        .status();
    assert_eq!(status.as_u16(), 404);
}

匹配器

wiremock 提供一组开箱即用的匹配策略 - 查看文档中的 matchers 模块以获取完整列表。

您可以使用 Match 特性以及 Fn 闭包来定义自己的匹配器。有关更多详细信息,请参阅 Match 的文档和示例。

间谍

wiremock 可让您设置对 Mock 调用的期望次数 - 查看更多信息请参阅 expect 方法。

期望可用于验证副作用是否已发生(或未发生)!

在测试结束时,每个 MockServer 实例关闭时自动验证期望。验证失败将触发 panic。默认情况下,您的 Mock 上没有设置期望。

响应

wiremock 允许您使用 ResponseTemplaterespond_with 指定预定义的响应。

您还可以选择让 Mock 根据匹配的 Request 返回不同的响应,使用 Respond 特性。请参阅 Respond 的文档以获取更多信息和示例。

测试隔离

每个 MockServer 实例都是完全隔离的:start 负责在您的本地机器上找到一个可用的随机端口,并将其分配给新的 MockServer

为了确保完全隔离并且没有跨测试干扰,不应该在测试之间共享 MockServer。相反,应该在使用的测试中创建 MockServer

MockServer 实例超出作用域(例如,测试结束)时,后台运行的相应 HTTP 服务器将被关闭,以释放其使用的端口。

运行时兼容性

wiremock 可与 async_stdtokio 一起使用(并且经过测试,可正常工作)作为未来运行时。如果您遇到任何兼容性错误,请在我们的 GitHub 存储库 上创建一个问题。

效率

wiremock 在后台维护一个模拟服务器池,以最小化连接数和启动新 MockServer 所花费的时间。池化减少了您需要调整操作系统配置的可能性(例如 ulimit)。

此池旨在不可见:它使您的生活更轻松,测试更快。如果您最终必须担心它,那就是一个错误:打开一个问题!

先验技术

mockitohttpmock 为 Rust 提供 HTTP 模拟。

请查看下表,了解 wiremock 与它们在以下维度上的比较

  • 测试执行策略(测试是否需要顺序执行,或者是否可以并行执行?);
  • 在测试中我可以模拟多少个API?
  • 开箱即用的请求匹配器;
  • 可扩展的请求匹配(即您可以定义自己的匹配器);
  • 同步/异步API;
  • 监视(例如,验证在测试中一个模拟是否被调用或未被调用);
  • 独立模式(即我是否可以在测试套件之外启动一个HTTP模拟服务器?)。
测试执行策略 我可以模拟多少个API? 开箱即用的请求匹配器 可扩展请求匹配 API 间谍 独立模式
mockito ✔ 并行 ✔ 无界 异步/同步
httpmock ✔ 并行 ✔ 无界 异步/同步
wiremock ✔ 并行 ️ ✔ 无界 异步

未来演变

可以向提供的开箱即用的请求匹配器中添加更多匹配器来处理常见用例。

  • stubr 用于在 Wiremock 中挂载 json 模拟,并作为命令行界面(CLI)使用。

许可

根据您的选择,许可为 Apache 许可证版本 2.0 或 MIT 许可证。除非您明确声明,否则您提交给此软件包的任何有意贡献,根据 Apache-2.0 许可证定义,应作为上述双重许可,而不附加任何其他条款或条件。

依赖项

~11-22MB
~326K SLoC