#kubernetes #mocking #api-testing #框架 #openapi #api-calls

kubernetes-mock

用于与 Kubernetes API 交互的模拟框架

1 个不稳定版本

0.1.0 2023 年 10 月 19 日

#703 in 测试

Apache-2.0

27KB
312

kubernetes-mock-rs

Rust

模拟 Kubernetes 客户端,用于测试与 Kubernetes API 交互的内容,包括 控制器

运行 make doc 查看文档、示例等。(发布后将链接到 docs.rs!)

488 行代码,但其中有 24% 是文档注释。

功能

  • 非常简单易用,只需像程序应做的那样调用相同的 API
  • 设置错误容易,文档详尽 - 如果有问题,它应该能帮助你解决
  • 测试失败时详细错误,显示确切错误
  • 支持多个 Kubernetes 版本(目前为 v1.25,v1.21) - 要更改版本,请使用功能 v1_25v1_21
    • 默认为 v1.25,如果您想使用不同的版本,请记得在您的 Cargo.toml 中使用 default-features = false

示例

最小可编译示例

use kubernetes_mock::*;
use kube::{Api, api::ListParams};
use k8s_openapi::api::core::v1::Node;
#[tokio::main]
async fn main() {
    let (client, mut mocker) = make_mocker();
    let api: Api<Node> = Api::all(client);
    mocker.expect(|| async {
        let nodes = api.list(&ListParams::default()).await;
      },
      MockReturn::List(&[Node::default()]),
    ).await.unwrap();
    // ...
    let handle = tokio::spawn(mocker.run());
    api.list(&ListParams::default()).await;
    handle.await.unwrap().unwrap(); // Assert tests pass with `unwrap()`.
    // Requires two calls to unwrap - one for tokio spawn result, the other for the mocker result
}

注意:unwrap() 对于格式化来说并不理想,如果您想看到格式化的错误,可以这样做

if let Err(e) = handle.await.unwrap() { // still need one unwrap() for tokio spawn
    panic!("{e:#?}"); // debug pretty-print
}

待办事项

  • 测试 mocker.watch() - 它工作,但没有经过测试。
    • 我们可以使用控制器来测试这一点,以展示它是如何工作的。
  • 测试更多边缘情况 - 传递给 expect() 的函数崩溃,等等。
  • 探索更好的 API 设计?
    • 我们能否让 expect() 执行多个API调用,意味着人们可以用一个来处理所有API调用
  • 我们是否可以放宽限制(例如,无序API调用,允许同一个调用多次/“多次”,允许不同的参数)?

欢迎提供帮助,查看 CONTRIBUTING.md

Apache 2.0协议下分发。更多信息请见 LICENSE

依赖项

~6–27MB
~370K SLoC