使用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.32.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d21267847ca34d7c00b172e91462ff711c9c62431e977b5ac70d37e057b0cc5f |
|
MD5 | ab20a715b8a15048500664711667d1b4 |
|
BLAKE2b-256 | 2a45e50896d1d1c0ce024ba75659b064e97b216496a7beb347bdaff4fac5cbbf |
Hashes for atomic_bomb_engine-0.32.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 56060b0f4186d03837986ba3e23d4250c5b50799290cf3aae71386bde44d820d |
|
MD5 | aec90c0fee744c877029ee0408c27872 |
|
BLAKE2b-256 | 72c701c8e6ac18dc56d25b7c612888194fa53bbb29e1220ccca53716084b7334 |
Hashes for atomic_bomb_engine-0.32.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | adf45f1b74aa02b70aa1fb05be2d34e82c81a4a8c36b67b6d1c0eb0a446ed7e5 |
|
MD5 | 5cfe7f56c0f45507c5eec32a18d63059 |
|
BLAKE2b-256 | 94f3d823b47afee4647ed229fe51f22f527f11ebb3d841c7c3b792829ca75668 |
Hashes for atomic_bomb_engine-0.32.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2aae9f5f7c1143d417e65f11ab08a15c66de3a216c790c49bb349087ab92735 |
|
MD5 | ab7ab9c553ba350f15093cd49c1975f2 |
|
BLAKE2b-256 | 281bf7c02df5d46fbd36399f056c1d5e500012d21654dde2b085633219130ceb |
Hashes for atomic_bomb_engine-0.32.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 717469932dfada27bcc71780106fe5f9de3c3e6ba91d4be5d93281b067833e11 |
|
MD5 | ffb64b00d0c7e57784c41aefdb833ea6 |
|
BLAKE2b-256 | 15ec89147709a187fd6d1eeb77414f65a5a15a3940acf213b7db8fdc8c91d88d |
Hashes for atomic_bomb_engine-0.32.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 17558c2efd3c0ede5ac05ff6fd53af966357c107b498bac40bce97a540f54b25 |
|
MD5 | 9570a2bfaed6a998325d8a2b113bdcaf |
|
BLAKE2b-256 | 14386e93d1b02e5aa795af3aa424619d7b9de4ac4cfac17e95904fa7cfe2241f |
Hashes for atomic_bomb_engine-0.32.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f9830857a0c9f57037edb50724111924445a3534e0ada20c53ec1a9f3d6cb74f |
|
MD5 | c2425099297ebb1638a67bdcb659256d |
|
BLAKE2b-256 | d4c481371b3d338c1458f781b06d49f14af2fc8989e5a058b0039a96a41f49da |
Hashes for atomic_bomb_engine-0.32.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c89660149d11137e18ae95f038c6fac33b21e6300d602c4776e8a9fe04030733 |
|
MD5 | f0570e343130087558043bc8cbdbdcf3 |
|
BLAKE2b-256 | c31e511e1e3f0bacba882117c702e774da17c35111d18944741748cc17328150 |
Hashes for atomic_bomb_engine-0.32.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d74effeb54b8090ac774e1a358e8554277ec5a66306528db644e010a4c6de65 |
|
MD5 | a4320d4304b56f102c72e90ee95aee6b |
|
BLAKE2b-256 | b783714ca5a1ec9eac6f02cb0919d11cd79288df1ce6a76c455fbaa2426378a3 |
Hashes for atomic_bomb_engine-0.32.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fd3401161e728a47f246ddd5112cf6a1f4a055fc1f27cb730ebe76087522b0bf |
|
MD5 | 35346a9382b919d92c108a9210041403 |
|
BLAKE2b-256 | 4786979e705d6499b456ffe16d2ed437a735a366c0e8df56f139748be5ec0595 |
Hashes for atomic_bomb_engine-0.32.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 16f88dd342c94afa2a071b3852f0c4f23bd47b2ca91692625d5ccdd0ecb34c27 |
|
MD5 | a9b1e500327a4f04d96b93d5fbe632aa |
|
BLAKE2b-256 | c7380f367ea664a7b18b32868561aa9f333b4e5e7109da05fd0393e3f3799b37 |
Hashes for atomic_bomb_engine-0.32.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bbe89f2bd91fcbbf1210308ffb9427e79926c3e837a037278bbfc04fa584403b |
|
MD5 | 4e879a27563e47327a9ab51187eabde6 |
|
BLAKE2b-256 | b1bbe9b376529e01f8e06c3967235b43c07e9225483d1a8bda4110e95d7345fb |
Hashes for atomic_bomb_engine-0.32.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d233502385c66fd6d89da1a9beb54f1e66f721ef0ebe5062ca43880174584961 |
|
MD5 | e0410f768268caa40da5ca0971013392 |
|
BLAKE2b-256 | 625f3220319fff09624a0e637d5ba9dd84f6fad3fbddbd23eb8511a903819999 |
Hashes for atomic_bomb_engine-0.32.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e0ee31a9420674b9dbc7bd44b0eacbed5adcea1294886990697f54c11d910996 |
|
MD5 | 8bf36d5e4016da5d8351172590965940 |
|
BLAKE2b-256 | ec98fee2af98aa9d12ad1125e0c9ce6db714beee50ca71f90fee72b6ebc819c4 |
Hashes for atomic_bomb_engine-0.32.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a8b33bb1072a40412e921d656c5d6c3df4c7209c6d76e8645c925303022c3484 |
|
MD5 | 481c5a44a42c379fec5b7331c0b6d25b |
|
BLAKE2b-256 | bdccb970744b8d21c4bc5448433a7ae449449d5b9dd96b5bfe2d8d0d2aef45a6 |
Hashes for atomic_bomb_engine-0.32.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b4aedc39eae3da5b877a349e8d3963cb4993b9cff38abdaa64217a90de18c578 |
|
MD5 | d7de7a1e6542c76986b05704297c3d37 |
|
BLAKE2b-256 | 96e2ddfa07791da314ce700c2f448d6e627a50525b4340936b4d481ccd86401e |
Hashes for atomic_bomb_engine-0.32.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | be62d927116ccfebbb6efb305c0d9abbc629f3e3af495dd6857f713434e5a162 |
|
MD5 | e3191c783588475aa7230d5c8b81801c |
|
BLAKE2b-256 | df9f9d4f621ce5536b658d87eb8bb1ddf0d440fca0c5c116221c6008665a56a0 |
Hashes for atomic_bomb_engine-0.32.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5c7d55f90e80a94a72d6f4f66519bca08a9c20272669bb25bab356e073e650a6 |
|
MD5 | cf12862d71120ec8f56335c8ec0c00cd |
|
BLAKE2b-256 | 60e88ed19420ed1efe5676931ae215fa84c2292ccc25731e8f0cc5a636b9d377 |
Hashes for atomic_bomb_engine-0.32.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | be76f11cac124e49174269a1cad951b82bf5d7ec402af8fb46b67e7321693ad7 |
|
MD5 | 0c43f2869a40602001502a737d83a4f0 |
|
BLAKE2b-256 | f78d65b46c996d3e3f4b57eea3fda154c91610c92dd13ef18ecade3c6fc7fff0 |
Hashes for atomic_bomb_engine-0.32.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 34997bddce5d0e4705ca8aff38abd7ec6456432ddb8c0ddcfbb248860859e8cb |
|
MD5 | 1c4342ec854b2f5a8989a0d1e3b9e831 |
|
BLAKE2b-256 | 9117d68a4baceccaec126f943f6ac85c8024b9bb880ac0826b360f3cfd735233 |