使用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.33.2-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 41969057c69d092b61c25fbf914d724f4d8e94e656ec34a5a68624150857be5b |
|
MD5 | ed91707032a2ea4488fbb36755f36a40 |
|
BLAKE2b-256 | 8cd5acfb1e96226e3cc1b8ef6d65d5e6a9f8483756fe280aad715f84a2bd6214 |
Hashes for atomic_bomb_engine-0.33.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | faef17b468cde3e0915c391b5b047dc9144a38f09f77468d80364089e286a31d |
|
MD5 | 23f1b5fc899cbf075b7f6435f96191db |
|
BLAKE2b-256 | 72c407cda777efabfc35ed1d601b99963b413e92fe28a3d415124b2b6baf6bc2 |
Hashes for atomic_bomb_engine-0.33.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6a7b3da4862db0a733b0ccbf2ade28956aceca6c9f4a0e6852dcad8faea1c083 |
|
MD5 | a0a758a9ecbe65b8f1d6ec5d155293fa |
|
BLAKE2b-256 | b749c55e6d45e8e7164480477bc1fd09babc6100681944603524c71c9883f9bb |
Hashes for atomic_bomb_engine-0.33.2-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 122a95361cd18546b0aca9c80d54eb8d4d20f9ee6fa5e0f725480153b788f820 |
|
MD5 | df36f2f1f4951493c14708a18e521430 |
|
BLAKE2b-256 | 711a5f108365db9b9c91580fa0851d64a1ff389019fef99f2f3ace6c86823719 |
Hashes for atomic_bomb_engine-0.33.2-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f7634532cd1cda3073530273f62ef68917f19625430cd6bd0f13186d907be5e3 |
|
MD5 | 0f463ed0c8caa940567ce1d77018c8b3 |
|
BLAKE2b-256 | e880fd22762d3853c96579f3ec0e9b79cc0536b9322b4cf26c5b4e3677f8688a |
Hashes for atomic_bomb_engine-0.33.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f15ba60636222e6236550d8e2a90ceb033bef84f3160efb37dac991ec55d6c7d |
|
MD5 | b37d081833565f6e4877497d202db3cb |
|
BLAKE2b-256 | 1647f3121c57dd093b5096b8d0f306dcbd7005674ef21d31dc09eab1edcfd191 |
Hashes for atomic_bomb_engine-0.33.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 27fb44dbef71e1ead52c02709b079bdcb78005f54a844078115fdc2157662760 |
|
MD5 | 4c9943db41630863b8f3949bab5075a7 |
|
BLAKE2b-256 | c7a2772437475219daac2b2f22f9124db54c3f3b556e8685b7efe0a62d555a34 |
Hashes for atomic_bomb_engine-0.33.2-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b82883db73bdaf6edd2acce38d4dd265dd1f6373f55233c496f2f6f7376d7221 |
|
MD5 | 09ae241eb4477d3e6c686e081bba768a |
|
BLAKE2b-256 | 8ce701713dace284aeffb288ad004c960189d01cd2601ac094e8c9b7d03d05b4 |
Hashes for atomic_bomb_engine-0.33.2-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7fc745e431cf746fafd3002808049fdacdf23782c1b00238bbaaa2b75e11f811 |
|
MD5 | ed862e1b5e08187c8d614e8579cdae45 |
|
BLAKE2b-256 | c85b6e798581128d32bc0a002e492e0cadd8c4c0baf8f9aab6bd6eda7d3a1f1a |
Hashes for atomic_bomb_engine-0.33.2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0598cf29e2bde505f55cdd7695b423023a73b3fc45d36555ed5a5f9e1b7d6158 |
|
MD5 | 0ff3cea022d4698533b49f435e49d89a |
|
BLAKE2b-256 | e4b92f6d69aeab48566c1e34c6a7bf1416eb9df3a779a46bc0f7d8d96cfa139a |
Hashes for atomic_bomb_engine-0.33.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 70c3ad8281f6b530284a79fa0dc698988bf3d48a3006fdd2a1377576e48ec6fc |
|
MD5 | 8faa5090e5ba7dc192eef0dec67061be |
|
BLAKE2b-256 | c7c789765064e7607b6d6090d99d9e1b34e3247fe3d5ab4538417d9078d52601 |
Hashes for atomic_bomb_engine-0.33.2-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 47fbf10708695d74be619d67ef5f0c324949beded98d1165fb91924cd23b7ada |
|
MD5 | e54116f66d2fd596be4eff027e1ab19e |
|
BLAKE2b-256 | 78bc616db6f622dfdddcfe60a7933b65111edd1d5d4a2d18c0f0bbe3f86b392f |
Hashes for atomic_bomb_engine-0.33.2-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4d8b0026dd1ebbb9e4f79c866690d1bb16566f0b7f5c0ba929b0522c905486df |
|
MD5 | e792de626f450625b268c1c6be884217 |
|
BLAKE2b-256 | 18606e979f05a5e1ccaed778df72c03db12ef52b19a60463750097f7a49565a8 |
Hashes for atomic_bomb_engine-0.33.2-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4c94c7c11c945729e577afc2d58e55be1b7d503409dfb0039c16947b26b3e0a5 |
|
MD5 | 46ecf96e76e25dc52a46e3532c776b68 |
|
BLAKE2b-256 | f53eb34a79034696e297f65b90323494a8c7da1a9597274f61aa114029d1c8c0 |
Hashes for atomic_bomb_engine-0.33.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 40e85e63038b28811bdc203f98e6ae9755f372707d5955467c6c0c93ba40538c |
|
MD5 | d0d089b6ef46fca366c5038ac4b645f1 |
|
BLAKE2b-256 | d785dba4dc831abb6ed69620e53f500d74e8a3dc2a6ec7bf19b882a71e86e392 |
Hashes for atomic_bomb_engine-0.33.2-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b5bbca57d706c322aed075094da5eef1f6301047946bbe3cb3595ecc3e47f1a8 |
|
MD5 | 71018555340aaa800a45af958d4595cf |
|
BLAKE2b-256 | 2b08f3febe04acc0f335672ab9b6b614773130ffe7850c485873308cb299b732 |
Hashes for atomic_bomb_engine-0.33.2-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9d124bee940dd1e8f8321ac1f5cf2a5a03bd259e36e5360ae4142f1ba3a6bd04 |
|
MD5 | d3dd14e8c77499db68118fef2a5e6502 |
|
BLAKE2b-256 | 4c2f387321a7511f710ff62a58e6ab9f481ef8cbd88f1f1b10fcce726216b4eb |
Hashes for atomic_bomb_engine-0.33.2-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 57d304e1c324fcd79449ed0f1d506c262346f5f9d9469fd7f237ee2204f61010 |
|
MD5 | 2e41b60499c65efb2f8a45699b23e331 |
|
BLAKE2b-256 | 06d754d1d0cf2a703bda9daf9ecc7082a5c739c26ea582e5b9475ff91c7a492f |
Hashes for atomic_bomb_engine-0.33.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d9ded457384bcaad672f745b163fc46aceb2da3a2b52f908726ab9ebaae35aca |
|
MD5 | e92d79c618a726caebe851246c8f6174 |
|
BLAKE2b-256 | b35e35067074ba0d9e0e9259acdcb2c7135b11c83dba71823ec37398831dad9b |
Hashes for atomic_bomb_engine-0.33.2-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 585efca12a39ca3457f864ea30aab821cd225c817a4c32e5533a8ff8925cdeee |
|
MD5 | 627cf45e08ae754aaf3899f21b565720 |
|
BLAKE2b-256 | 5a4db35d59b5d3c2575b39245a1f6236b63606795bc671db95dae8ae8bcab7bc |