使用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.36.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8b68e045b62c7b2bf03169d9f35352c2d3cf46c6a2877df32ae5786498825929 |
|
MD5 | b40659fe535a21b0a58285ee6cf909c9 |
|
BLAKE2b-256 | 06dbde0674f326e43a2e699b8d2bfef14e4fbeb556d2d0dfff31c5fffbdf93b7 |
Hashes for atomic_bomb_engine-0.36.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 84efcb74980ac8fef3e159a2b1f879aeb35e885652165e4d4bf6c99327798a29 |
|
MD5 | fc34715ea7541e5a65b86604fb547b05 |
|
BLAKE2b-256 | efe3ea5e3306cb641c254a6515f6bcadfd51ea4450f48378bb147b42377f97bc |
Hashes for atomic_bomb_engine-0.36.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 514063f76a65ec80711ecfe03555a5a4cd53542bb67fe88580d6c7f1653e8846 |
|
MD5 | 4dae88ed3325823baab0300764f8cc01 |
|
BLAKE2b-256 | 8ce4477d27e2c606b9a3ef3c79cba141b7264de78ba1cd851d46e06585e67698 |
Hashes for atomic_bomb_engine-0.36.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ff8095991a45af8d9e33cc72cec01b46d4d2dfdc1f4111bf5bab8403ea8ee8bf |
|
MD5 | 5007020633d3db727528ec1e54f188ca |
|
BLAKE2b-256 | ffd5b214dce83899fd2cd743199143744bc9b1a7e170513e5203a7847723c525 |
Hashes for atomic_bomb_engine-0.36.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | aaa35971318011c1b1fb1f00599faa30e081dd76f13b42a52ef6bc30bc960dbe |
|
MD5 | 4a14b7120d9a6299e810ece44951d2e4 |
|
BLAKE2b-256 | 0625bb7a37e302d8e5e9e75ce8c68808362f732924c62c7ae91a967b9fd7b788 |
Hashes for atomic_bomb_engine-0.36.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6048ef3371a0927a35b34869c2e07554d179b3b24638f2444e8710709ec4d452 |
|
MD5 | 8b2bfeef65028d28b91a84c452f0ee72 |
|
BLAKE2b-256 | 709429f54c6cafef8060fe7840ff33ab4119bf45c00cde3749dd437ef16f11f6 |
Hashes for atomic_bomb_engine-0.36.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 41b2150729365c01546c24396d66074823e979f5b8bf71856066af622e7f7d16 |
|
MD5 | f3b2c602db79a19f94c57d81fe0dc284 |
|
BLAKE2b-256 | 01009f242b55b4e0a13542776ee9df6d114d998a32533b6b56fcba4e2399af95 |
Hashes for atomic_bomb_engine-0.36.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | af484fbeb70cfc0a1054993f9f786147141df5aa180ef31e8abd3395e7ea95dc |
|
MD5 | 0cdb10444a28b9dad0853c23f4036be6 |
|
BLAKE2b-256 | 73c8f9e3a7a2aa502e92d9ede4121a57a1fa8e199788032de669ebc5c83eb648 |
Hashes for atomic_bomb_engine-0.36.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 62da3c1f62bbce05792902887f745474ac7e3d1c8286662b35827ebb55448cbd |
|
MD5 | 3243e83e85732f36e4af368d83659945 |
|
BLAKE2b-256 | 89827f02a37c579adb91c72e9863e87b2527f0e50e31d9253caf51e06152a32b |
Hashes for atomic_bomb_engine-0.36.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2c4f9633c3b367ce30b171fdf690c7fad3d85781b95d35bf6ad99ea6542e6a7f |
|
MD5 | e268bd443b32ba7c2b0eefd78ff2da83 |
|
BLAKE2b-256 | e0a133f7005bc3298dee3db8783b0346470a779a61c470bf71051dfd22007edd |
Hashes for atomic_bomb_engine-0.36.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e277470d030794e6b0d32b1e6162b1b9237e5d56db5b61607d66d909d4a34448 |
|
MD5 | 0c73c2edc36350f83a0282419dec0f06 |
|
BLAKE2b-256 | 74fa74a195b7423b062fa1ae99c23d5c381e2d113bafc084a49ee13b18490121 |
Hashes for atomic_bomb_engine-0.36.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c50b9ba1ece1cda12c5652c64ce7313e45209f0d78cad099f54d037105fbba02 |
|
MD5 | 43ac3632a993ac1d8cfe7d728ab6eb1f |
|
BLAKE2b-256 | e780866c33c6a97f58e652b5d775f0d6c105154bbbf559d04c33a752a8a4d719 |
Hashes for atomic_bomb_engine-0.36.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c173c6bb534fc5095df2a6b7ccb2be69239d43afd71c53702389c3b6a0a5e41c |
|
MD5 | 20a5f8d09a4b88fcb2f867f4c1898ae7 |
|
BLAKE2b-256 | c062f70e63637d937e6a2d90f3faf85df2b8f5c2050f90f57a107bddb08c78d8 |
Hashes for atomic_bomb_engine-0.36.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5170cc959435431956031e97981182aa8a7f1accbe446d61d2ab57bf70da5521 |
|
MD5 | f43993d408012719726ef3b317c11c91 |
|
BLAKE2b-256 | 0a0a77bac7aa17e30c6da047a12dd70b1b733f8023fb3939a8676bae826e9caf |
Hashes for atomic_bomb_engine-0.36.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8313bad8022eed27ca03c76b16488b09f9edabfdce4d7a9fea39b3277cc2a8b4 |
|
MD5 | e69ea2aec976f9a67f24762174760eaf |
|
BLAKE2b-256 | 4a2073e91901c55473a86213ad577efbabb540c7576e6aaecf051f63ea12bc9d |
Hashes for atomic_bomb_engine-0.36.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6d08c4cafae73818238ffd5839cb75b5a83188b7da8a4bf80bf6e35b47a6a280 |
|
MD5 | 4ff398eb1f0cd0d74b2511506438a0d5 |
|
BLAKE2b-256 | 76e542f3f26ee5f040ec1c4d9c0642e3b2e174230df6605ca965a47c73d8fad9 |
Hashes for atomic_bomb_engine-0.36.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c450f0ae13997543659d6de0668e05ff45c5a2b53bdc6fc15d3bcb3f48c88f6c |
|
MD5 | 34ea46aa62cc33e95f06f8c65fddb7e3 |
|
BLAKE2b-256 | 130ec25869cab63b4d552072c23cc5d174eaaf746c2546b4a8be6a572c430af6 |
Hashes for atomic_bomb_engine-0.36.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0ae0b0e1a3ddb50a9cfa85aa57db0a56d9983b5ead2506d6494476a959a5b8e6 |
|
MD5 | 2c5ab49832039a9694f3bb0baa7175a9 |
|
BLAKE2b-256 | ff7e05ce037432955970272ab62880b9f25f4f1b7746e0d27bdd76e8a81c70f4 |
Hashes for atomic_bomb_engine-0.36.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 71fd3f6981fd2d494c6767018bfce0c07430501c7d955098741d583a37d1cc44 |
|
MD5 | 6b410564703a4ed8bef34801492b7bf1 |
|
BLAKE2b-256 | ad5647592f88448e08311a44f67b1c0399b061801f673719ab405945c5c8fc7c |
Hashes for atomic_bomb_engine-0.36.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 270d65dbf3a1df3b156cbcc0796a5c000916416891eba2abf300443e57d42d8e |
|
MD5 | 353a9549c82cdccec3f7b4fd6375fd64 |
|
BLAKE2b-256 | 5bfe3546529164dcd1f04cb6d164aab9fd2615ec0d17d4d2607b8e051ea68253 |