使用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.29.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7a905d908abb5dfd8a16afe40d6d8bf077f29a54ea36f8abf02880d680885d83 |
|
MD5 | 6f1c17b4fb4549b7fcf2fa49cd1249ec |
|
BLAKE2b-256 | bc815828f2f6a1a560d911e07df1553adb04de5421376db6a0da62b613e256ca |
Hashes for atomic_bomb_engine-0.29.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c49bfc4f75d2c04ebae774e3e0a3d7f3f52ab6f3bad8d67579134deed5f0c9d1 |
|
MD5 | 033e50fcb22fef6ec5737ffc6fcea2b4 |
|
BLAKE2b-256 | ff9263d75cf6139bfd2925fe3974dd2b05ee79a60154e6ad9e88f9e863c34e1a |
Hashes for atomic_bomb_engine-0.29.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e6369dcf94673161dd06ee4c2a3659bd2ddcb54c70d83685e99ef4c26b134734 |
|
MD5 | 5d2d182fd5a0cf7513992b5b7ad97ac5 |
|
BLAKE2b-256 | 8eafa4768bb7689c8b43384fcc58ffe10e60cd09d5e8b2dc4fbce34ac53248f8 |
Hashes for atomic_bomb_engine-0.29.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 271a184e6974433af4473a0bfc827e99ee93f960328a62d3272af6f42f29ebe3 |
|
MD5 | 3d7f278a658ed53f3af89ac148427749 |
|
BLAKE2b-256 | b0fa03741f7d43a1fdb6043fd74a9c26623a83dd3668121b3e9d60a7841a467d |
Hashes for atomic_bomb_engine-0.29.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 55563627a60bcbe974dccb2927b7ceff9d331f154336486d574111d5e3ebaf11 |
|
MD5 | d4a0a033db7ea2e416a7ee06f3e0a804 |
|
BLAKE2b-256 | a4c447e94e2d2eff2a944fbaaaf2612026470bc63fb7296cf0d1ecc0b0e56316 |
Hashes for atomic_bomb_engine-0.29.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cc38724867246a699a5d7e11d6fda09fc95679276a9a7bc84c8ed359d7e79db8 |
|
MD5 | 75c53bc9d1e640b4263ad8cc1bf5966e |
|
BLAKE2b-256 | d771f5a9ee3509f7b695b3d0812f7ac7d33a86ba7fe990460cc4128535b8288e |
Hashes for atomic_bomb_engine-0.29.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3a8f940af1056ffac76251019ed2f2e36c28f0ede7788101dbc8ce7ebe220d7b |
|
MD5 | c53a73c05598bf2426607127abf920ab |
|
BLAKE2b-256 | 23dcc196f77154e26a485b57e096e9cef4c5a3d5ef2dfebc469d2f15fe252065 |
Hashes for atomic_bomb_engine-0.29.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 45f1a068d163fbb986e6f001c4332bc2e1730ad50171fcb826d8d25666c1a5c3 |
|
MD5 | 7a4d235efd4c759727ea3a59f30d1cf9 |
|
BLAKE2b-256 | 290e6f2483d04017545390927a4e222a1fc0123ab6fe913e24199a46aa6d9f5d |
Hashes for atomic_bomb_engine-0.29.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a288b551a8ab31a55f85c801a718e2c65b52375a97603c96e1d6ed223a02218b |
|
MD5 | 84480b0b7522c7611e4c71616ff7bf5a |
|
BLAKE2b-256 | b911496cbac3e0ec48fe0fedae0e71f2618aaba9fdb9cc18a5f51219438f8862 |
Hashes for atomic_bomb_engine-0.29.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b0f618ef9c2547588ca6b17885d9dbfb7034649747718c627fde44488d7b0afa |
|
MD5 | 7bf227daf20da6f9a81b86881e01d0d1 |
|
BLAKE2b-256 | 6fcecf05a2eced303a0d18b6ae5d3bb2dafe075d42dd17a2ef24140eb2df597c |
Hashes for atomic_bomb_engine-0.29.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | aa60c0ce696b34ef0af2816d51733db41c10ad4d57745837f5a3944229924082 |
|
MD5 | 850f97a374f74e690b84a0f637f7b02b |
|
BLAKE2b-256 | 5764c5067b1f1e387afbfe2222fd1e70baf9f54b99fe09d4e57a1761397fe03a |
Hashes for atomic_bomb_engine-0.29.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 45ebfd91688c0cd13242a3aa970e0f6edead65d459c8cbb91fe9d0b755f9a28d |
|
MD5 | 982583af682dc7340e7b4c4b57d78331 |
|
BLAKE2b-256 | 16803d9c33163c2ab69cb2d6e2458aa581491c604b86368551cfc9276002683b |
Hashes for atomic_bomb_engine-0.29.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 397bf01179b3ec5baefba4cff2611d37d031cc93f496d2b7f916aacc50433603 |
|
MD5 | a22cbec34885e2c92f4ca7cf7b4ff5ba |
|
BLAKE2b-256 | 9382f9c0e1ba1f365e429ec6dcf28a7c0bea5c8141b368ca928a146e5a16fcbb |
Hashes for atomic_bomb_engine-0.29.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 61ec3c8b06f77d35ad6b70d8c5c2eddc3dc6301da3f8193c937a1aef6cffbaed |
|
MD5 | b9c062806b2561d3ee2d2e1c52e617d0 |
|
BLAKE2b-256 | 3aa48b3108183b1220e004bbeda82411fdf71d74e5d5a77e8727ac833ff7a508 |
Hashes for atomic_bomb_engine-0.29.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5b3897d884f93e687a5a695cbea27d5757df9d1a004cc78ca73e13fb1dafdbb7 |
|
MD5 | f2e43a5c1b2a3d7ed1312be61b09f45d |
|
BLAKE2b-256 | e9b47312f11b60238a8030dc4e377cc7d10e95bf0d716dca9d28bb0cae173901 |
Hashes for atomic_bomb_engine-0.29.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | aecffd41e24e5732dcc3639d409601acb6e9fef26ef16a4345de22df3740b619 |
|
MD5 | 920a4e7d9cb82a24e1c596656ef7aca7 |
|
BLAKE2b-256 | 23c62bef5bf7d91f24ce1c6aeaf657fab23a4acfd4a19d49e3db7da6fd5d5ca1 |
Hashes for atomic_bomb_engine-0.29.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c9ead74692d6749c9515aeb0afe72974a22fa603264e23459433649868c65e63 |
|
MD5 | 13a0f7eef098c1fd9128ae29e3e06ce9 |
|
BLAKE2b-256 | 7dbe691e387e67a15fee2bcb34e91ea80833b227da61c052d01da1aefaa6deca |
Hashes for atomic_bomb_engine-0.29.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6ce157af055fc09baaed1e8d05a170c7901d3d826b467d57b913d37587c04ccb |
|
MD5 | d93673aaece741d13b46078dcb98ac6f |
|
BLAKE2b-256 | 1341964ae795074948a60a0388d21de2009c9c3f543ddd9df35200a313b73530 |
Hashes for atomic_bomb_engine-0.29.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2c213d7467aa621cd9d963881901403787d6293594786663a0b02aecc77144fd |
|
MD5 | 6090fa5e3d9feb8d4ec8391230253929 |
|
BLAKE2b-256 | 7859a3c160b77445fa5f712d3839b8989ae2bdf013af9de803e2b19f838b8486 |
Hashes for atomic_bomb_engine-0.29.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 81f3acfde133f71280b940b8ac39ee1525582421e98ccc28ff8c480b5d75d807 |
|
MD5 | 3f259152c3390f11e90b45cb32cc9074 |
|
BLAKE2b-256 | c26e1c25e603f6ad95cad90bc501128f5ab7deeff66b9986004766727773b667 |