news 2026/5/1 8:30:52

开源测试工具| 使用rust开发的python压测工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源测试工具| 使用rust开发的python压测工具

介绍分享一个开源测试工具,atomic-bomb-engine-py:使用rust开发的python压测工具,这个工具是由 qyzhg 同学在TesterHome社区网站的分享。

项目背景

公司的原有压测平台是由 go 开发,使用 locust 作为压力引擎使用,在互联网的大环境下,开始各种降本增效,性能测试的 pod 现在缩减到只有 1/8 个物理核心,这种情况下,locust 大概 300 并发都已经出现了 cpu 瓶颈,所以需要一款性能更好的压测引擎作为替代品,刚开始的时候是想直接使用 wrk 集成进项目中,但是遇见了几个比较麻烦的问题:

  • post 请求需要使用 lua

  • 无法对压测过程进行监听

  • 项目过于庞大,二开十分困难

所以经过调研现有的开源压测引擎,没有符合现在的平台化需求的,所以诞生了这个项目,之所以选用 rust,是因为 rust 的性能会非常的好,而且高并发的压测下,没有 gc 对结果产生影响,引擎写完后,可以直接导出一个 c 的入口,go 开启 cgo 会比较简单的将项目集成。

由于引擎是一个独立的项目,无公司的业务部分,可以直接开源。介于现在大部分测试人员的技术栈都是以 python 为主,所以又在引擎外面,使用 pyo3 开发了一个 python 的包装器,可以让更多 python 技术栈的同学直接调用,为了方便大家使用,又开发了一个比较简单的前端页面,可以满足简单的压测需求。

项目地址

  • python 包部分:https://github.com/qyzhg/atomic-bomb-engine-py

  • 引擎部分:https://github.com/qyzhg/atomic-bomb-engine

  • 前端部分:https://github.com/GiantAxeWhy/atomic-bomb-engine-front

项目已发布到 pip,可以直接使用 pip 安装使用,ci 部分使用 github actions 进行矩阵编译,支持 python3.8-3.12,linux-x86, mac arm、x86, win-x86,应该可以覆盖大部分环境,如果有特殊需求,可以联系作者添加 action

项目内部架构设计图

项目界面

使用说明

准备开始

安装:

pip install atomic-bomb-engine

在 python 中导入

import atomic_bomb_engine

异步使用的时候,还需要引用 asyncio

import asyncio
主要方法说明

多接口压测可以使用 batch_async 方法进行操作,函数签名和解释如下

  1. async def batch_async(

  2. test_duration_secs: int,

  3. concurrent_requests: int,

  4. api_endpoints:List[Dict],

  5. step_option:Dict[str, int]=None,

  6. verbose:bool=False,

  7. should_prevent:bool=False) ->Dict:

  8. """

  9. 批量压测

  10. :param test_duration_secs: 测试持续时间

  11. :param concurrent_requests: 并发数

  12. :param api_endpoints: 接口信息

  13. :param step_option: 阶梯加压选项

  14. :param verbose: 打印详细信息

  15. :param should_prevent: 是否禁用睡眠

  16. """

使用 assert_option 方法可以返回断言选项字典

assert_options=[atomic_bomb_engine.assert_option("$.code", 429),atomic_bomb_engine.assert_option("$.code", 200)])print(result)

jsonpath 如果不会用的话,建议去jsonpath学习
使用 step_option 方法可以返回阶梯加压选项字典

  1. def step_option(increase_step: int, increase_interval: int) -> Dict[str, int]:

  2. """

  3. 生成step option

  4. :param increase_step: 阶梯步长

  5. :param increase_interval: 阶梯间隔

  6. """

同样的本包中也包含了一个对 api_endpoint 的包装:endpoint 方法,方便调用,endpoint 中的 assert_options 中也可以套用 assert_option 方法

  1. async def run_batch():

  2. result = await atomic_bomb_engine.batch_async(

  3. test_duration_secs=10,

  4. concurrent_requests=10,

  5. api_endpoints=[

  6. atomic_bomb_engine.endpoint(

  7. name="test1",

  8. url="https:xxxxx1.xx",

  9. method="get",

  10. weight=1,

  11. timeout_secs=10,

  12. assert_options=[atomic_bomb_engine.assert_option(jsonpath="$.code", reference_object=200)]

  13. ),

  14. atomic_bomb_engine.endpoint(

  15. name="test2",

  16. url="https://xxxxx2.xx",

  17. method="get",

  18. weight=1,

  19. timeout_secs=10)

  20. ])

  21. print(result)

监听时可以使用 BatchListenIter 生成器

  1. async def listen_batch():

  2. iterator = atomic_bomb_engine.BatchListenIter()

  3. for message in iterator:

  4. if message:

  5. print(message)

  6. else:

  7. await asyncio.sleep(0.3)

同时调用时同单接口

  1. async def main():

  2. await asyncio.gather(

  3. run_batch(),

  4. listen_batch(),

  5. )if __name__ == "__main__":

  6. asyncio.run(main())

使用内置 ui 界面

导入

from atomic_bomb_engine import server

导入内置的 server 后,可以使用内置的 http 服务器,开启一个 ui 界面,并且开始监听压测过程中的数据,无需手动迭代数据

  1. import asyncioimport atomic_bomb_enginefrom atomic_bomb_engine import server@server.ui(port=8000)async def run_batch():

  2. result = await atomic_bomb_engine.batch_async(

  3. test_duration_secs=120,

  4. concurrent_requests=100,

  5. step_option=atomic_bomb_engine.step_option(increase_step=6, increase_interval=5),

  6. verbose=False,

  7. api_endpoints=[

  8. atomic_bomb_engine.endpoint(name="test-baidu",url="https://baidu.com",method="GET",weight=1,timeout_secs=10),

  9. atomic_bomb_engine.endpoint(name="test-google", url="https://google.com", method="GET", weight=1, timeout_secs=10),

  10. ])

  11. print(result)

  12. return resultif __name__ == '__main__':

  13. asyncio.run(run_batch())

BUG 和需求

由于项目开启时间较短,只有短短一个月左右,可能会有一些 bug 和没有做的需求,如果发现了 bug 和需求,都可以联系作者,由于是工作之余开发,可能不会太保证时效性

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 13:24:29

还在为论文AIGC率高发愁?8个写论文AI工具,真实参考文献,低至9%!

你的“高效捷径”,可能正将你引向学术深渊 你是否还在为DDL临近而抓狂,打开空白文档大脑一片空白?你是否曾将论文段落丢给通用AI,指望它帮你“妙笔生花”?你是否在收到查重报告,看到刺眼的“高AIGC风险”时…

作者头像 李华
网站建设 2026/5/1 7:45:06

知网AIGC痕迹太重了怎么办?7个降AI率工具,快速降论文AI率

市场上的降AI率工具良莠不齐,如何科学判断降AI率效果是很多学生、老师最关心的问题,担心降不来AI率,耽误时间还花不少钱。 本文将从以下五个维度系统,分析2025年主流的8个降AI工具,教大家如何选择适合自己的降AIGC工具…

作者头像 李华
网站建设 2026/5/1 5:49:55

LobeChat语音交互体验实测:真正实现自然人机沟通

LobeChat语音交互体验实测:真正实现自然人机沟通 在智能助手越来越频繁地出现在我们生活中的今天,一个现实问题逐渐浮现:为什么用了这么多年AI聊天工具,我们还是觉得“它不像人”?打字输入、等待回复、再逐行阅读——这…

作者头像 李华
网站建设 2026/4/22 22:37:58

Git第一次提交代码到远程仓库

一、Git第一次提交代码到远程仓库 第一步:git init 初始化项目文件夹第二步:git add . 键所有文件添加到暂存区第三步:git commit -m “first commit” 提交到本地仓库第四步:git remote add origin 远程地址(git bran…

作者头像 李华
网站建设 2026/5/1 5:56:09

Web自动化测试:如何生成高质量的测试报告?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快运行了所有测试用例,控制台输入的结果,如果很多测试用例那也不能够清晰快速的知道多少用例通过率以及错误情况。web自动化测试实战之批量执行…

作者头像 李华
网站建设 2026/4/28 11:26:56

LobeChat积分体系规则生成器

LobeChat积分体系规则生成器 在AI助手逐渐从个人玩具走向企业级服务的今天,一个看似简单的问题正变得越来越关键:如何公平、灵活地管理用户对大模型资源的使用?无论是防止API账单爆炸式增长,还是为未来的商业化铺路,开…

作者头像 李华