使用rust开发的高性能python压测工具
Project description
atomic-bomb-engine-py
atomic-bomb-engine的python包装实现
前端仓库
atomic-bomb-engine-front
使用条件:
- python版本 >= 3.8
- windows(x86), linux(x86), mac
使用方法:
-
准备开始
通过pip安装 (0.5.0版本之前)
pip install atomic-bomb-engine-py
在python中引用时注意,需要引用atomic_bomb_engine, 而不是atomic_bomb_engine_py
为了避免混淆,0.5.0版本之后,pip更换了包名,更改为atomic-bomb-engine,
pip install atomic-bomb-engine
在python中导入
import atomic_bomb_engine
异步使用的时候,还需要引用asyncio
import asyncio
-
开始压测
-
单接口压测(功能与多接口压测重叠,已废除) -
多接口压测
-
多接口压测可以使用batch_async方法进行操作,函数签名和解释如下
async def batch_async(
test_duration_secs: int,
concurrent_requests: int,
api_endpoints:List[Dict],
step_option:Dict[str, int]|None=None,
setup_options:List[Dict[str, Any]]|None=None,
verbose:bool=False,
should_prevent:bool=False,
assert_channel_buffer_size:int=1024,
timeout_secs=0,
cookie_store_enable=True
) ->Dict:
"""
批量压测
:param test_duration_secs: 测试持续时间
:param concurrent_requests: 并发数
:param api_endpoints: 接口信息
:param step_option: 阶梯加压选项
:param setup_options: 初始化选项
:param verbose: 打印详细信息
:param should_prevent: 是否禁用睡眠
:param assert_channel_buffer_size: 断言队列buffer大小
:param timeout_secs: http超时时间
:param cookie_store_enable: 是否为客户端启用持久性cookie存储。
"""
使用assert_option方法可以返回断言选项字典
assert_options=[
atomic_bomb_engine.assert_option("$.code", 429),
atomic_bomb_engine.assert_option("$.code", 200)
])
jsonpath如果不会用的话,建议去jsonpath学习
使用step_option方法可以返回阶梯加压选项字典
def step_option(increase_step: int, increase_interval: int) -> Dict[str, int]:
"""
生成step option
:param increase_step: 阶梯步长
:param increase_interval: 阶梯间隔
"""
同样的本包中也包含了一个对api_endpoint的包装:endpoint方法,方便调用,endpoint中的assert_options中也可以套用assert_option方法
async def run_batch():
result = await atomic_bomb_engine.batch_async(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
print(result)
return result
监听时可以使用BatchListenIter生成器
async def listen_batch():
iterator = atomic_bomb_engine.BatchListenIter()
for message in iterator:
if message:
print(message)
else:
await asyncio.sleep(0.3)
压测+同时监听
async def main():
await asyncio.gather(
run_batch(),
listen_batch(),
)
if __name__ == "__main__":
asyncio.run(main())
压测时使用ui界面监控
0.5.0版本后,添加了ui页面,支持批量压测方法
导入
from atomic_bomb_engine import server
使用
import asyncio
import atomic_bomb_engine
from atomic_bomb_engine import server
@server.ui(port=8000)
async def run_batch():
result = await atomic_bomb_engine.batch_async(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
print(result)
return result
if __name__ == '__main__':
asyncio.run(run_batch())
使用server.ui装饰器,可以给批量压测方法启动一个简单的web服务器,不需要再手动监听BatchListenIter生成器
内部架构图
[0.19.0] - 2024-04-16
Added
- 增加了初始化和参数模版功能
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)]
上述实例展示了如何在初始化的时候调用某个接口,并且通过jsonpath将数据提取出来,保存在全局变量test-msg和test-code中 提取完全局变量后,就可以在后续的api_endpoints中使用
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
]
上述实例展示了如何在请求中使用全局变量,使用双大括号即可使用
Fixed
- 修复了如果http状态码错误时,不会记录
- 修复了json反序列化的问题
[0.20.0] - 2024-04-17
Added
断言更改为异步生产消费,提升性能
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
[0.22.0] - 2024-04-18
Added
前端进行了性能优化
[0.24.0] - 2024-04-22
Added
异步断言使用了补偿消息,保证消息的一致性
[0.25.0] - 2024-04-23
Added
在endpoints中增加思考时间,模拟用户行为
think_time_option(min_millis=200, max_millis=300)
- min_millis:最小思考时间(毫秒)
- max_millis:最大思考时间(毫秒)
使用时在endpoint中增加think_time_option参数
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-1",
url="http://localhost:8080/a",
method="POST",
weight=1,
timeout_secs=10,
json={"name": "{{test-msg}}", "number": "{{test-code}}"},
think_time_option=atomic_bomb_engine.think_time_option(min_millis=200, max_millis=300),
),
]
[0.26.0] - 2024-04-24
Added
- 增加endpoint中的setup,在并发中可以做接口断言
- 增加有关联条件下的cookie自动管理功能
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
)
- 参数cookie_store_enable控制是否自动管理cookie,前置条件的cookie会带入到最终的压测接口中
- 在endpoint中使用setup_options可以传入多个接口,并且提取参数
- 提取到的参数如果和全局的setup的key冲突,会覆盖全局提取到的参数
- 接口中提取的参数只能在本线程(v-user)中使用
- ⚠️ 使用时注意:setup_options是顺序执行的,没有并发,但是相当于添加了think time
[0.28.0] - 2024-04-25
Added
- 将持久化cookie添加到全局选项中
- 复用http client
- 选择性开启断言任务
- 接口初始化时出现错误等待后重试##
[0.29.0] - 2024-04-25
Added
- 优化并发逻辑
- 前端更改为web worker发送心跳
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
TODO
- 前端展示页面 ✅
- 接口关联 ✅
- 每个接口可以配置思考时间 ✅
- 增加form支持 ✅
- 增加代理支持
- 增加附件支持
- 断言支持不等于等更多表达方式
联系方式
- 邮箱:qyzhg@qyzhg.com
- 微信:qy-zhg
👏🏻👏🏻👏🏻欢迎加群交流
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Hashes for atomic_bomb_engine-0.31.1-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 345ecd5344de93c1e9ef50a9619b30ebd0fb4c5ca04d5f753d748eaccb5cc6a9 |
|
MD5 | 7d1f7c376793bb6fcc1c9ba60bbc00df |
|
BLAKE2b-256 | 7ebe6c08769b6b5c195da1726cd523ae5b46ced5435b5d4394daa2a744cc5dd4 |
Hashes for atomic_bomb_engine-0.31.1-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | aa245261503fce9ea0ebfa44d32a9646b45fe6cc5bc4457092ce6ab695b19cc3 |
|
MD5 | bfa233e4083a100d03da9f8836144282 |
|
BLAKE2b-256 | c079f2caad0554c15f45e7b456d8f87e2fc3a20c2f8b57713222586fdf1369a4 |
Hashes for atomic_bomb_engine-0.31.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f6aff11704810db8d2ef1f91256da0150c2b256138097edd05d9bca349c12329 |
|
MD5 | 8eccfde74413febe327f30cdd6b7a37b |
|
BLAKE2b-256 | 93096d62992ba763ceced9e95d861ba911edf0ada361b005d4f890c998b99fa3 |
Hashes for atomic_bomb_engine-0.31.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ff35cc6998fc74f25894865293ac9480014966db53028f70a8618612002f9464 |
|
MD5 | 4e46bfdd4c00c99b2b0b43dcb6d754d8 |
|
BLAKE2b-256 | 91949399a140e69cd6b3028016479fc29462df9db3d474f1c5beeed92d0609ca |
Hashes for atomic_bomb_engine-0.31.1-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 486ae1a238c240e8d6ab4bee7d91da7fa24d2bd23a91a4e44d01b79cc92d3efd |
|
MD5 | a35d5fb1c2c639dca57af1e722b7f01a |
|
BLAKE2b-256 | 1812e382310e827f60d93ac214e3982fad7d57c0ebef2dbcd2dd375fe408b138 |
Hashes for atomic_bomb_engine-0.31.1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c1fb59352b26a67f8fa94a4562de30afc83e49596b3a2c506fa585f8d93c59e0 |
|
MD5 | 094e7010e98940ecf8b5583a08b0041b |
|
BLAKE2b-256 | 0067bdf314e97bb3c1cc87cc65ccafd1ff983182dbc6069227c2c89a502c477c |
Hashes for atomic_bomb_engine-0.31.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 037747305ce616297c9b84785d2c29753cd96393a78f5295d79710cc558e4526 |
|
MD5 | c364866ec9776bf6425459ac5d9aa32d |
|
BLAKE2b-256 | e972919f320d6dbb392587cfc2649b335d511a4db031a783588295f0fe132b4e |
Hashes for atomic_bomb_engine-0.31.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c08e8a128ea9de5e5527825c2f0edb2788e308257cc531186f2dcf3e63c2af40 |
|
MD5 | 84ad92573fdff0652757959dd1be7320 |
|
BLAKE2b-256 | 37b31a18f73dea711ba4e52114dae4b189d428ab13db54400405509895a45033 |
Hashes for atomic_bomb_engine-0.31.1-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c9ac1ed15b06c2231c51d64b56be8d19859f03e2b829f6242d4d29db06269b7 |
|
MD5 | 44d0eece2bd8f2b789e04b154b8bff02 |
|
BLAKE2b-256 | 17542bfe8add457f27ab87a97afaccb66f008fbd75a7a12647ece3da10f25a85 |
Hashes for atomic_bomb_engine-0.31.1-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d5ffd47cdc8f6d16d8f107a69e9ab1cda5714edaaa93ad8e24659623ac7283e4 |
|
MD5 | 076adcfeddb4bbd5721d8a24a78127d7 |
|
BLAKE2b-256 | 61aa53842643c8c1f9f680f08d6aaf76bdda06524fb3ccd97bebdb582fff226d |
Hashes for atomic_bomb_engine-0.31.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e915ea0c40ac871275ff49b7a894074593d66bafcd17508079041edc9f70f46e |
|
MD5 | 67b7ab91c64ade4d82f87e7a29ef826e |
|
BLAKE2b-256 | 53aa67458f28dc061e119a3fe554ea731c9cfcfe893dc2bf8ec5ff9c61ce328d |
Hashes for atomic_bomb_engine-0.31.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3b5febc7d22acafa272a53cb4ae62fcd22b0098858484d90a8cab0eb6520697a |
|
MD5 | a3fff3f9283f4ae5594ca37f55dd1691 |
|
BLAKE2b-256 | c7a1f485d5581890f530c8f087e4e040de78cb1b9134946f3f111577b73dd1b5 |
Hashes for atomic_bomb_engine-0.31.1-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1146a141e499f24d17765839c595fb57bb9f49fba2559c2774c4f1ab9ff0eea0 |
|
MD5 | 46c17beb3823e4fe8a8abe1967d1e93b |
|
BLAKE2b-256 | 26bcb08dc19b717ae59adb08d20ea695192442f6b1193ad4611a89a01bc635ab |
Hashes for atomic_bomb_engine-0.31.1-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ec173326d00c690138f8581d89cb7e672fbc0803deee7604b50292a8cb1d14d5 |
|
MD5 | 8b86c3376aeaf9983c812796ccfa6df1 |
|
BLAKE2b-256 | 64d077738dff978dd674cab93c8b5a438a8bee450969a186eda12d7cbebeb95d |
Hashes for atomic_bomb_engine-0.31.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5f3adec7bb90bf5878bd4b0b9221f8b3560e6eff561f671ff3db11f271a3210c |
|
MD5 | 36764379196286472908686a7f473cf2 |
|
BLAKE2b-256 | 2577a2f7c77b00ffa80ecb059dee1ec523a271e85a4f9d0688a9a1bde67595ab |
Hashes for atomic_bomb_engine-0.31.1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2962b59bae12aed613e364267b6e2268aa640fd027f2b1087b602400f6b79af |
|
MD5 | 7c1e4deaf9c6f80323f8f87dc235fb77 |
|
BLAKE2b-256 | 4ed275ce0f3dfca6b43f9b24f36904ce09762e4a78a047480c6345bb59b3d9cd |
Hashes for atomic_bomb_engine-0.31.1-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 23fae400bc049f9d72c53f9bfad80ef4f3110c0c16bffffd11189c5dcbf1f798 |
|
MD5 | ae5d253aaa081142d521c85dbb729482 |
|
BLAKE2b-256 | 7f4b142dc4004a150da14dc822816cf4597c261b06eaa3e1ea0370c829499407 |
Hashes for atomic_bomb_engine-0.31.1-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 95b4f9d1e46678c7d5c2419cd1edffcc90c516060d67848480b76c9ac688888c |
|
MD5 | 86d2e901f44904ee8a5b266fc3ba34c7 |
|
BLAKE2b-256 | f0966a8ff11c59ad01ebc201acddf75625b824270bc121b4d5b9ae72fe055bd2 |
Hashes for atomic_bomb_engine-0.31.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | af93d14432f2472ddaa45fcf56df7f1242843f245e2cb77ad7d8a408b7c26156 |
|
MD5 | 58e2a370a388be39cbb8c56da153ab68 |
|
BLAKE2b-256 | deb81cbe2818ff2518800dbed6ff9661def26bb53db185f59c431776fd4dea12 |
Hashes for atomic_bomb_engine-0.31.1-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6b9fcd600ffa3f0b188f6f6d9b69cd1b6b4c166f7b83147a3ab153ca46035444 |
|
MD5 | 76e02079041824c985bfd1c6be08bee5 |
|
BLAKE2b-256 | fbdff037638ae697c4859774a9f9f365878ca23354829dd6ee19a1b367d99f8b |