使用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
- 选择性开启断言任务
- 接口初始化时出现错误等待后重试
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.28.1-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0a5de40a0ef24003e0434291329f37e17ccf272ebb77995a366f9e10c0ea3f2d |
|
MD5 | 14c24b8f572c6b33d2ae5d11b9fe2767 |
|
BLAKE2b-256 | 8184cc082ca3d1ca2e345e76dc8dc9e0d330fc7764209b49dab7e45e0fa3c273 |
Hashes for atomic_bomb_engine-0.28.1-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6d15652a088f79aad1f824badfed06ff009f50446083ebcc77f3a2182d30ecd1 |
|
MD5 | 198f81a5351153876f83fa5c0493d69e |
|
BLAKE2b-256 | 5ee2208d4e93da7159852c31236bb76c483b3b7ef2ceff2a54aecc93809a1d18 |
Hashes for atomic_bomb_engine-0.28.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d232ae7d597d431afbe940f29ee5d0e6471065d276c986c24d74751899c5b6af |
|
MD5 | a16462b87cfa8b64d74ec37ef694bece |
|
BLAKE2b-256 | 150896f265326a56b8bd898b34e697b9c66356823a0d125d928f097707a3fbbe |
Hashes for atomic_bomb_engine-0.28.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9054a8f272d40b97c41aa37f406b9c0bd3cf9603e34393266ae29eec76b4c8de |
|
MD5 | e0b8db1dea3a4a435a621522f03614e0 |
|
BLAKE2b-256 | f584bdf67c1321aa42260c38f6c3acc64da9b9b8fe59b5ab7fdca54c211f0daa |
Hashes for atomic_bomb_engine-0.28.1-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 69a9c2647133d8f56b8f261b440aa49c0eebcea1d7d31a5bd78d00680b252942 |
|
MD5 | f5e68580abda8bfb0e136749e11cfa32 |
|
BLAKE2b-256 | d944281684d849ba1bc28848f944cb27e09689a25da1569071f87a42543928d6 |
Hashes for atomic_bomb_engine-0.28.1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 78b6edf4896ca8f157673327fb88be1bd61d6ac449e3945036109d606cfbb3cf |
|
MD5 | 70e0cab5760480402f666f64331d228f |
|
BLAKE2b-256 | b9032ae2cab22d1bdfde34d49be57b3390a426e907800a108d43ffe05179e490 |
Hashes for atomic_bomb_engine-0.28.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fc258b78a9c384150a48f4172ed215312f4b41f47f73150683c5fba1b4f70d4d |
|
MD5 | 05567228ed2e973d906570fc2e3edc4e |
|
BLAKE2b-256 | 5eff09ba3c6fc25433d023941886554592b45f8eb30a79d5415f0fcf13c3c5de |
Hashes for atomic_bomb_engine-0.28.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 978e23d818663d2fb1b97694f32ec895cad718ec65d0173ec2df7fb540088df3 |
|
MD5 | c94be2bc0d9b1f48e9add6542c8e0264 |
|
BLAKE2b-256 | dc9bd2f9d4121f444a2518b4761509d534f0840924153005cc29be33285f7db2 |
Hashes for atomic_bomb_engine-0.28.1-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cd147e42140d4a93cc7ed9665552ac9683b965ae7a8ae3ae563c445685d5d149 |
|
MD5 | 1a65cc3a4bfc12573af03910af31c490 |
|
BLAKE2b-256 | 12596e5e097f68239f013879ac2c821016f955faecb06916e058d349e9bd1189 |
Hashes for atomic_bomb_engine-0.28.1-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d7adc05037a1d01e701e7da704831f676a54e2a8fe15b21ed8f70a3d78e9f49 |
|
MD5 | 4aeb1f2694a46bd4a14ac0cd94543968 |
|
BLAKE2b-256 | ec15086941913b76f297b4bb1337bd80f460b16d1805418d34e7741dd15f348a |
Hashes for atomic_bomb_engine-0.28.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9b09cbc267ec94ea587841e733a17626eca10a7a44ac35b197048da012865687 |
|
MD5 | 5a4aec266eaf187e05eeeb40c8edd2a2 |
|
BLAKE2b-256 | d12cea768c7010fc1bd134f140520570d272274c22d0c22bbfe4c29d474d95df |
Hashes for atomic_bomb_engine-0.28.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 38e0a2472183735a914661109e2c57da64ec75b71b1b3320f4fba15a51ecbf63 |
|
MD5 | 2588ad4b675ea55fa57f0c546f858b06 |
|
BLAKE2b-256 | 639f1febe33dbeffe586ead30cc24a90c9fe49da70b0ccf2be458918fcd1b732 |
Hashes for atomic_bomb_engine-0.28.1-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1ffa10a8b81f65f1d27403d9403f4089637b4319cd543a54d95d87ac8a0a7dfa |
|
MD5 | a44f2aab541edf9a5ae6f02dc3e52493 |
|
BLAKE2b-256 | 4f000558ff59b5133e705aa64e29a411f2c315c96dd237f293dc923b4c3c3e6e |
Hashes for atomic_bomb_engine-0.28.1-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8be6131fb7a0fccc16365a033328cf3e505431cf549b1dc22254542785ffc82a |
|
MD5 | e45aab5041488018e71ee06cf9be6eec |
|
BLAKE2b-256 | dfd0f79ee171d814b15467ee61d6ebefbee10424f59cbd0b41aea70f040e5ed6 |
Hashes for atomic_bomb_engine-0.28.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | da1e1222db4f90563c7bd754622fd74fad40a19826a96a4da672d2cc56a27895 |
|
MD5 | 43853ffd24bf722cbba2e5ffbfc13a1d |
|
BLAKE2b-256 | f6e765b024350292658be2678e0a8973993e45fb7527a17355ec5e34cba5bcd9 |
Hashes for atomic_bomb_engine-0.28.1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 92189cc5d2bc8342d34d26d5b28681aa7f5019eca312e0fd5690693dcb6898ab |
|
MD5 | f9d306e5865ee52d5777423f775b402e |
|
BLAKE2b-256 | 284661cc9c5a525f7c26a669a71fca0e74a2dc2c3a3b7ef3cb827fc9b236125a |
Hashes for atomic_bomb_engine-0.28.1-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e263fe607e7a31f4b96a25f543847f32879a955df88ccb0caea58c5576d10b8e |
|
MD5 | 970e585ad58eb200656a9b140bb6bb98 |
|
BLAKE2b-256 | 24ca6ce03818a9fa65c4b8e532a0274da7e44b5da6de62c8dd2c88ad5b510f5d |
Hashes for atomic_bomb_engine-0.28.1-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2b3e929ae702b3a9f1e6b77c3a555c1ff797d3680f18ba35a40f5845437dafc2 |
|
MD5 | d7b9ed134bfaececae79a0da3d390c2b |
|
BLAKE2b-256 | aa8ec088f8aeea00e3b4231b36690a1a27a3a75d57d033bc8e3eab7949423bd8 |
Hashes for atomic_bomb_engine-0.28.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 06424594f3d4bb57d0a9b8f988683335f827520f5b78ac2fbc4725cc0b0dc629 |
|
MD5 | 83f436908a7438a376968f803b140335 |
|
BLAKE2b-256 | 89e28143f0d7de1810aa64dfdf44a315c9317b984710d4b4608efde2b8369f87 |
Hashes for atomic_bomb_engine-0.28.1-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e197235092eb64ee3273722788abbc892aa1b2723ed1de163d60fc3091516e01 |
|
MD5 | 4e4b89385353271fd59eecacb3eb5539 |
|
BLAKE2b-256 | 328a800ee80f28b195f8a49f927163531979df2d8ccae96e2f12a8457f0401da |