1 个不稳定版本
0.1.0-alpha | 2024年7月5日 |
---|
#1 in #reqwest-client
140KB
3K SLoC
Loates
Loates 是一个针对 Rust 的超快 🚀 负载测试库,专注于易用性和灵活性。Loates 受到 grafana k6 等工具的启发,您可以轻松模拟大量用户来测试您网页应用和 API 的性能和可靠性。
与 k6 这样的工具不同,它为您运行 JavaScript,Loates 是一个简单的 Rust 库,用户可以使用它来定义他们的测试用例。Loates 没有针对特定用例进行设计。用户可以决定他们想要进行负载测试的内容以及如何进行。
特性
- 高性能:利用 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
贡献
我们欢迎社区贡献!如果您想贡献,请叉取仓库并提交一个拉取请求。对于重大更改,请首先打开一个问题来讨论您想进行哪些更改。
- 叉取仓库
- 创建一个新分支(git checkout -b feature-branch)
- 进行更改
- 提交更改(git commit -m '添加一些功能')
- 推送到分支(git push origin feature-branch)
- 打开拉取请求
祝您快乐负载测试!🚀
依赖项
~7–23MB
~328K SLoC