49 个版本
0.6.1 | 2024 年 7 月 22 日 |
---|---|
0.6.0 | 2024 年 2 月 11 日 |
0.6.0-rc.3 | 2024 年 1 月 18 日 |
0.5.22 | 2023 年 11 月 30 日 |
0.2.4 | 2020 年 7 月 31 日 |
#12 in 测试
594,113 每月下载量
用于 188 个 Crates (184 直接)
160KB
1.5K SLoC
wiremock
wiremock
提供HTTP模拟,用于对与第三方API交互的 Rust 应用程序进行黑盒测试。
它使用请求匹配和响应模板提供 HTTP 响应的模拟。
名称 wiremock
是对 WireMock.Net
的引用,这是一个从 Java 到 .NET 的原始 Wiremock
的端口。
目录
如何安装
通过编辑 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
允许您使用 ResponseTemplate
和 respond_with
指定预定义的响应。
您还可以选择让 Mock
根据匹配的 Request
返回不同的响应,使用 Respond
特性。请参阅 Respond
的文档以获取更多信息和示例。
测试隔离
每个 MockServer
实例都是完全隔离的:start
负责在您的本地机器上找到一个可用的随机端口,并将其分配给新的 MockServer
。
为了确保完全隔离并且没有跨测试干扰,不应该在测试之间共享 MockServer
。相反,应该在使用的测试中创建 MockServer
。
当 MockServer
实例超出作用域(例如,测试结束)时,后台运行的相应 HTTP 服务器将被关闭,以释放其使用的端口。
运行时兼容性
wiremock
可与 async_std
和 tokio
一起使用(并且经过测试,可正常工作)作为未来运行时。如果您遇到任何兼容性错误,请在我们的 GitHub 存储库 上创建一个问题。
效率
wiremock
在后台维护一个模拟服务器池,以最小化连接数和启动新 MockServer
所花费的时间。池化减少了您需要调整操作系统配置的可能性(例如 ulimit)。
此池旨在不可见:它使您的生活更轻松,测试更快。如果您最终必须担心它,那就是一个错误:打开一个问题!
先验技术
mockito
和 httpmock
为 Rust 提供 HTTP 模拟。
请查看下表,了解 wiremock
与它们在以下维度上的比较
- 测试执行策略(测试是否需要顺序执行,或者是否可以并行执行?);
- 在测试中我可以模拟多少个API?
- 开箱即用的请求匹配器;
- 可扩展的请求匹配(即您可以定义自己的匹配器);
- 同步/异步API;
- 监视(例如,验证在测试中一个模拟是否被调用或未被调用);
- 独立模式(即我是否可以在测试套件之外启动一个HTTP模拟服务器?)。
测试执行策略 | 我可以模拟多少个API? | 开箱即用的请求匹配器 | 可扩展请求匹配 | API | 间谍 | 独立模式 | |
---|---|---|---|---|---|---|---|
mockito | ✔ 并行 | ✔ 无界 | ✔ | ❌ | 异步/同步 | ✔ | ❌ |
httpmock | ✔ 并行 | ✔ 无界 | ✔ | ✔ | 异步/同步 | ✔ | ✔ |
wiremock | ✔ 并行 ️ | ✔ 无界 | ✔ | ✔ | 异步 | ✔ | ❌ |
未来演变
可以向提供的开箱即用的请求匹配器中添加更多匹配器来处理常见用例。
相关项目
许可
根据您的选择,许可为 Apache 许可证版本 2.0 或 MIT 许可证。除非您明确声明,否则您提交给此软件包的任何有意贡献,根据 Apache-2.0 许可证定义,应作为上述双重许可,而不附加任何其他条款或条件。
依赖项
~11-22MB
~326K SLoC