使用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.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 147394eec6faeefbc68ccb2d0351ec2246b6e63fe8c5c101f9d6fa9e5ab53ce5 |
|
MD5 | 80403b0d7567913efc529061568fbf25 |
|
BLAKE2b-256 | a98dbdbc66a594080abec80f83ccf0ea9328bf06ef6ef9b8c6f8ba72209c335a |
Hashes for atomic_bomb_engine-0.31.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1fe959bbfec8d7b9641a3b5ff449e0ea41156f66009c9315e1a9bfe743a24f57 |
|
MD5 | 235c4ee8f5c368dc31b5ef6c87a2d045 |
|
BLAKE2b-256 | 44ec23df6303c00c8a3d28eb1d5a1ed1684280b296677f569d848cfbab534bfb |
Hashes for atomic_bomb_engine-0.31.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9449e3efc78be153933cdb9099f315203c070399e0dce6115f04c762e822ed11 |
|
MD5 | 3a86b4873e18fcdc362b47451dc25778 |
|
BLAKE2b-256 | c1280478f846ac78b7b0e8c636fba10f35b117aba0513cb231d76e1adf37874b |
Hashes for atomic_bomb_engine-0.31.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b4ad8efc571d9322faf69785ef78602cc66c122e63461e5286f18ffeb08fdaac |
|
MD5 | 66fe3249c999c5c236aea448d7ce4a0c |
|
BLAKE2b-256 | 379739dc4cc4fe2010023abe8f1a48e658c1655c07c6c1d09d4117b095e96c49 |
Hashes for atomic_bomb_engine-0.31.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d75597066393717db24baf0f901355ad7df7f3c295654bc74e65a01fd6a9bec4 |
|
MD5 | 273cb7bc0711e335558e81e262bb2209 |
|
BLAKE2b-256 | dfa3ec2dc8627ffd2812af07721224430a9fae0659213ff4bad4ff830cfe2f06 |
Hashes for atomic_bomb_engine-0.31.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 99d57157fe0beadfe581f8763bb6d6efc81243eeba2e23e18c037a815fd1db9f |
|
MD5 | 360d2d5e309c4f40131a1ac97547ad3a |
|
BLAKE2b-256 | 653f2b9eb7dd89150b1d3174358cf0b84f813d1835941b293470a65caa1f2922 |
Hashes for atomic_bomb_engine-0.31.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0134a03a33f820dbdca23699904cc2ae01773317fd5dd7089e1bea394e9d17fb |
|
MD5 | 804f61a9bbbf393dc493e9cc1e41846a |
|
BLAKE2b-256 | 3e856906ecdd1bcc64743ecf8a585b72e191214c51066d5dee5a5c5b9fd28ffb |
Hashes for atomic_bomb_engine-0.31.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 383afb7fb88df57cc3aca141d883ddba9bcee40345a1689bd850c318b8736266 |
|
MD5 | 5b7f86c566ddc3c305c7f0ba4042bf7b |
|
BLAKE2b-256 | 49440307da46cb0a40c9249ca8b170a4a396b282fda0cf80d087a551e8ad9792 |
Hashes for atomic_bomb_engine-0.31.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 716a97717cea5a62188c92ca47e93f616c19d47c7d5bbea5b91ddd27f4d06016 |
|
MD5 | 0056c023fb4124d83833459f4284f1ed |
|
BLAKE2b-256 | 4f380f67029924232254293e409907bc4367d55b6b538e58adffb4c20b1f2847 |
Hashes for atomic_bomb_engine-0.31.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 83f1e675747ac0f9a4b33da82249cb8df9e96b360ef50f3185a946eaa94d2885 |
|
MD5 | 5d494e7a6fc36cf0da8e21f38ca0d2cf |
|
BLAKE2b-256 | 807f764568c07c4b625a9477b6caa2162f0c4ad52f84f0b7905fdba977f7e92d |
Hashes for atomic_bomb_engine-0.31.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 02b837ec746255290f6a8ebbab76d1718aceac61467f018e82545c37a999dc63 |
|
MD5 | ce3375e9faddae44a3317b967c21967a |
|
BLAKE2b-256 | 351734abf4c5a3989c6b4264fff521595acf9c0f3f1ac14ba6195564f0923efc |
Hashes for atomic_bomb_engine-0.31.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1454972b049c607bd737b770ab200974d5bc3da8811de81d87df22dff8a16427 |
|
MD5 | c65b8137e26590a6a09f8bccbbefd95c |
|
BLAKE2b-256 | c75fdad78bcdf43d462c786cc323c670d896cf58d177d4f9b749bb2de7193da0 |
Hashes for atomic_bomb_engine-0.31.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cf22e224a9b335261c3eb0267917d9a609f93c06e11977707dd6f83e1eb6bad1 |
|
MD5 | 81c807bd32805a8480481057d1a1b99a |
|
BLAKE2b-256 | 6e113b4265f05cb4d6ed77cf53cacf73a4e886eb1cd7cf84ab69c781393a4826 |
Hashes for atomic_bomb_engine-0.31.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 363b16c715d632160efee08be8e3a03e25a66b6ab48deb3adb1bcb06df4eb9fd |
|
MD5 | 1f032a8a394576b530c9a845f0f3b75e |
|
BLAKE2b-256 | ab2f1234cebc251e6378f74a0692691d78954c881a402285a3fb90fdbdd54f70 |
Hashes for atomic_bomb_engine-0.31.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 95323ea8d18aa5d52073568730889509b95c5f65d08fd38a847957e589766065 |
|
MD5 | 44b23d5f42e6bba69bee375196dcabe9 |
|
BLAKE2b-256 | 4f82f3e80a398e6698ab29ae91d98137cbd1a7ae85b0ae423591710a0a9a55c8 |
Hashes for atomic_bomb_engine-0.31.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7605ca546ca5cacb71b05d4e3951a2648963c6ba2bfd081d6e03f973a9f446e |
|
MD5 | 1fbf0ee4d99cf0a19f8d9103bc1edf25 |
|
BLAKE2b-256 | e585baa8fea21a097204d1ffeff123cc0787c5e426eed15a4cb4a2f0579399de |
Hashes for atomic_bomb_engine-0.31.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 193a04321db02b5551ff734e881964fec9813bbd12f648a5e4cfcd647297a0b7 |
|
MD5 | c39302f9cd1ddf0cff6963d4d856d2f0 |
|
BLAKE2b-256 | 2a9effcfb04fd50f18ecd9895a4786d374d4aa31d634bca1916fd00727d2727e |
Hashes for atomic_bomb_engine-0.31.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8c7fabdbd3bc4c526cf48740f87d9398d43dd1cf4d190c03ca75beaf10041811 |
|
MD5 | cc55bd7968c86687686fd6623b90c5dd |
|
BLAKE2b-256 | 8634f736e95aecaa05442c3ea94127b4bc04b2993dffca700aadc4690640f03a |
Hashes for atomic_bomb_engine-0.31.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d0fa82a2756e0c5db3ebc083cdded75ef5e9c05b16653bafcf42130ba3619847 |
|
MD5 | 74fc91b3ce9fa3940550ba00c945e84d |
|
BLAKE2b-256 | a135d04bd43fa41fd6d20d9a8dff75656f2fb9524f2b05cb8d20f87d9f3f24c3 |
Hashes for atomic_bomb_engine-0.31.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b34cf6d1eec65f173bb0751cc0acbe2196e779a17c94b2000d6810643fe9bd11 |
|
MD5 | c70c9449f56a244d4d907d831d6298cc |
|
BLAKE2b-256 | dc126dd94ae40f1634920a0b7a1b9eefdea0377539517ee127723daf145f78a3 |