#负载测试 #测试 #HTTP #测试框架 #reqwest-client

loates

Loates 是一个负载测试框架,专注于易用性和灵活性。

1 个不稳定版本

0.1.0-alpha2024年7月5日

#1 in #reqwest-client

MIT 许可证

140KB
3K SLoC

Loates

Loates 是一个针对 Rust 的超快 🚀 负载测试库,专注于易用性和灵活性。Loates 受到 grafana k6 等工具的启发,您可以轻松模拟大量用户来测试您网页应用和 API 的性能和可靠性。

与 k6 这样的工具不同,它为您运行 JavaScript,Loates 是一个简单的 Rust 库,用户可以使用它来定义他们的测试用例。Loates 没有针对特定用例进行设计。用户可以决定他们想要进行负载测试的内容以及如何进行。

screenshot of loates in action

特性

  • 高性能:利用 Rust 的性能和安全特性,Loates 可以以最小的开销处理大量虚拟用户和并发请求。
  • 可扩展:使用简单的 API 可定制的测试场景。
  • 实时指标:获取应用程序性能的实时反馈和详细指标。

路线图

  • CLI/TUI 组件
  • 内建的 Web 服务器,可实时在浏览器中显示结果
  • 使分布式部署更容易
  • 涵盖更多用例
  • 模拟更复杂的模式

入门指南

先决条件

  • Rust (最新稳定版)
  • Cargo (Rust 包管理器)

示例

use std::time::Duration;

use loates::client::reqwest::Client;
use loates::error::Error;
use loates::prelude::*;

struct MyUser<Iter> {
    client: Client,
    post_content: Iter,
}

impl<'a, Iter> User for MyUser<Iter>
where
    Iter: Iterator<Item = &'a String> + Send,
{
    async fn call(&mut self) -> Result<(), Error> {
        // In each iteration get the next string
        let body = self.post_content.next().unwrap().to_string();
        let res = self
            .client
            .post("https://httpbin.org/anything")
            .body(body)
            .send()
            .await?;

        if !res.status().is_success() {
            let body = res
                .bytes()
                .await
                .map_err(|err| Error::TerminationError(err.into()))?;

            let err = String::from_utf8_lossy(&body).to_string();
            return Err(Error::termination(err));
        }

        tokio::time::sleep(Duration::from_millis(500)).await;

        Ok(())
    }
}

async fn datastore(store: &mut RuntimeDataStore) {
    let data = vec!["a".to_string(), "b".to_string(), "c".to_string()];
    store.insert(data);
    store.insert(Client::new());
}

async fn user_builder(runtime: &RuntimeDataStore) -> impl User + '_ {
    let client: &Client = runtime.get().unwrap();
    let content: &Vec<String> = runtime.get().unwrap();

    MyUser {
        client: client.clone(),
        post_content: content.iter().cycle(),
    }
}

#[tokio::main]
async fn main() {
    let execution_once = Execution::builder()
        .with_user_builder(user_builder)
        .with_data(datastore)
        .with_executor(Executor::Once);

    let execution_shared = Execution::builder()
        .with_user_builder(user_builder)
        .with_data(datastore)
        .with_executor(Executor::Shared {
            users: 2,
            iterations: 1000,
            duration: Duration::from_secs(100),
        });

    let scenario =
        Scenario::new("scene1".to_string(), execution_shared).with_executor(execution_once);
    let scenarios = vec![scenario];

    Runner::new(scenarios).enable_tui(true).run().await.unwrap();
}

只需构建您的测试并部署到任何地方。

cargo run --release

贡献

我们欢迎社区贡献!如果您想贡献,请叉取仓库并提交一个拉取请求。对于重大更改,请首先打开一个问题来讨论您想进行哪些更改。

  1. 叉取仓库
  2. 创建一个新分支(git checkout -b feature-branch)
  3. 进行更改
  4. 提交更改(git commit -m '添加一些功能')
  5. 推送到分支(git push origin feature-branch)
  6. 打开拉取请求

祝您快乐负载测试!🚀

依赖项

~7–23MB
~328K SLoC