使用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,
verbose:bool=False,
should_prevent:bool=False) ->Dict:
"""
批量压测
:param test_duration_secs: 测试持续时间
:param concurrent_requests: 并发数
:param api_endpoints: 接口信息
:param step_option: 阶梯加压选项
:param verbose: 打印详细信息
:param should_prevent: 是否禁用睡眠
"""
使用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=10,
concurrent_requests=10,
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test1",
url="https:xxxxx1.xx",
method="get",
weight=1,
timeout_secs=10,
assert_options=[atomic_bomb_engine.assert_option(jsonpath="$.code", reference_object=200)]
),
atomic_bomb_engine.endpoint(
name="test2",
url="https://xxxxx2.xx",
method="get",
weight=1,
timeout_secs=10)
])
print(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=120,
concurrent_requests=100,
verbose=False,
api_endpoints=[
atomic_bomb_engine.endpoint(name="test-baidu",url="https://baidu.com",method="GET",weight=1,timeout_secs=10),
atomic_bomb_engine.endpoint(name="test-google", url="https://google.com", method="GET", weight=1, timeout_secs=10),
])
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="https://xxx.xxx/api/short/v1/list",
method="get",
timeout_secs=10,
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",
url="http://127.0.0.1:8000/a",
method="POST",
weight=1,
timeout_secs=10,
json={"name": "{{test-msg}}", "number": "{{test-code}}"},
),
]
上述实例展示了如何在请求中使用全局变量,使用双大括号即可使用
Fixed
- 修复了如果http状态码错误时,不会记录
- 修复了json反序列化的问题
[0.20.0] - 2024-04-17
Added
断言更改为异步生产消费,提升性能
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.21.1-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 687af9917eefe41378bcdd9ff733687b59ab18f0a3ce301c1d453a8f2ad4b451 |
|
MD5 | bfbdf665bef4ace4761a3ddca1fc9ded |
|
BLAKE2b-256 | a1b4a00694526cdc0e6c79bf125d3f9368bcb2914b492f0f086903114e1031b3 |
Hashes for atomic_bomb_engine-0.21.1-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4deb50f51cb523ce9eff882b123fb2ba7e94e70b86b2c2a077463903c32e4f4d |
|
MD5 | e013876cc1e5b114286d67768d28ab22 |
|
BLAKE2b-256 | b4c7f20184e30bf043f2cb293cfd545dc38ca966673a50084bd3e5d67c11cfe3 |
Hashes for atomic_bomb_engine-0.21.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f8650e7f83b6e74b57785e3d9797a4d9eec3c8530773a0080a4d0f7a3ebcd037 |
|
MD5 | 278418791046074bf103c9151cbc9a84 |
|
BLAKE2b-256 | d3509453f38257984ea6fb24d790e987a922277260697a06a3498042ce62f6ff |
Hashes for atomic_bomb_engine-0.21.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 34d110fe909ad69bcfd945f1f6314f9aaf79b626ad2f60dfb3fa2007a317663c |
|
MD5 | 6f4bbb2f9a09004d2b69e6fac76da20e |
|
BLAKE2b-256 | 0ec73ba6fbdcc354b7dd1fcb835f1ff355932b7e5f03903a4c3ac9773ad7c1dc |
Hashes for atomic_bomb_engine-0.21.1-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 907b92b98ffe7a4d2249f9f0e79dae9bde9e3c7ed269663b2e5bcf96aa210aeb |
|
MD5 | 47ff49e25067054bea2a840b078d13c4 |
|
BLAKE2b-256 | b187a71e054cd72870378dd2e2e16d7fb2b06e3e30dbc214ac1ce8f6feb58940 |
Hashes for atomic_bomb_engine-0.21.1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b1c89180dd484d8e29875fb95daf4159517fdd367e56758fb69870a87d2d06fd |
|
MD5 | 2d44789f134acd95d9c3e8ca3e798d08 |
|
BLAKE2b-256 | 629ab0199cd2fd02c05bb51c371705488d4a74ceb4c1d3ec6d8ebc3833b5e978 |
Hashes for atomic_bomb_engine-0.21.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5ae5c0cd3386316616c2463eece7e526c5474afcb4dc94bf69e5a257940ed54f |
|
MD5 | 2e8be9e3310926a25f0f0f8fc33f3499 |
|
BLAKE2b-256 | 537df0846db0d62ed6b8b59dc64dbdcf5656391df52bf9676b41348151da902e |
Hashes for atomic_bomb_engine-0.21.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 67da5c82c871e4309602d42eafb2e7a1e3aca3e85ee5644390ddaf7d3369a47e |
|
MD5 | e60cab00511fad243c4599d60b8079d1 |
|
BLAKE2b-256 | 3a1a36272ab2cb54f81a883a61dcfcba74d68d3ee74ce901c89ca967f92cc233 |
Hashes for atomic_bomb_engine-0.21.1-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a56286fae2c9ea92c96d680a923605d57c0e04aca48a9ca946690a03490882d9 |
|
MD5 | e0113c71fa63eecbc98087ea1e216254 |
|
BLAKE2b-256 | b3652398d766c040d7e601ff0e91b09a87582fbe0ea624451d77490be063593a |
Hashes for atomic_bomb_engine-0.21.1-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | df609d6e5f0d81f282d3943710a04648695494f34b2286a7d7a16b5c835ae042 |
|
MD5 | 9fdb1b1a8e5b43df818c35cb2983744f |
|
BLAKE2b-256 | f844a57557da98d249e101419242c7053c9dccd446e9687c52390185a727d4b2 |
Hashes for atomic_bomb_engine-0.21.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4e42fc4d1c399e0fef9c046ee6f860a1840c73fbfe1410eea1d4fceee336d070 |
|
MD5 | 0521bf324beecddf28fe6c3b55f41c4a |
|
BLAKE2b-256 | de57f6e551611e2928342ea21586435b8eaba932791b85db98e68e3382fcf5fc |
Hashes for atomic_bomb_engine-0.21.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 038e41e55dd3680d3fbea031fc9e577a04c3a2c6fd81532dc253519bcdf027c5 |
|
MD5 | b8b10b75944a4a8e20ea5802c559853d |
|
BLAKE2b-256 | 148c8e041591dc70c3417e0755d9d56c6f110263a4cc0a3b0f692685850216d2 |
Hashes for atomic_bomb_engine-0.21.1-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bf651b4aa9e0383ebeec8efd4e27c24eeca9d74390a39e83b858b09d459ac78f |
|
MD5 | 5f0c6c5e2580e959823aa14154b378b7 |
|
BLAKE2b-256 | f6220fe704a3bd30f38d9226aa8ab1a1b7563b59147ca972d472d42e3f9393e0 |
Hashes for atomic_bomb_engine-0.21.1-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 66db3ad77fdccd9913bde21c1c14f03b550448d48c1641c96276af7f34102990 |
|
MD5 | a26cf0cccd186ce4fb4a73bca867288f |
|
BLAKE2b-256 | 551e15d6836378d530505cbb769c82db537ef2a21d87e47be18c634bc31506eb |
Hashes for atomic_bomb_engine-0.21.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0140f1d779d41b67b8629071a26066bdd85466e74a17d69e3028786ee132bf7f |
|
MD5 | 2e912ee49161a3cfbb11405f62a131b7 |
|
BLAKE2b-256 | fc7d52d39f139947eb20c6011a14d834f9535dff73ec26a6d972c5c059e26a5c |
Hashes for atomic_bomb_engine-0.21.1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 462e82b89af97e10dc60e44704d61ae3f419ef667b4f84f3981c27901328756c |
|
MD5 | bac4fe228d67b68b638cf070b3c474e5 |
|
BLAKE2b-256 | dac554d3b859939ea0815875d61cdd33be2fdb3d0f7a61442a0dd93d41d2a7f5 |
Hashes for atomic_bomb_engine-0.21.1-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2dee75ff5b48b49470603e62a175ce963b415ea0be7a856f256738648ce0c6f6 |
|
MD5 | 847d22f2d39d93eb46d9a0d5c0a407cf |
|
BLAKE2b-256 | 0e23a768e703fa32502c9a633625201a22ec8ea4e416565fe667322107c48e4c |
Hashes for atomic_bomb_engine-0.21.1-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 44683ae8da990bcbc2d66d70950ec04fad02e1e60a085e498e41ef15dc57efdb |
|
MD5 | 009a07028851d488eeec075ee95ea9b8 |
|
BLAKE2b-256 | 957e1eed6f9dac0251cdfb05f94c49908bc1c276a7b4384dd3bbfa65e9b30130 |
Hashes for atomic_bomb_engine-0.21.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8c8e25e31ef110774e7ab3ec4d862fd60126c0ee0bd16167123ad9f613c01bd8 |
|
MD5 | 4665b54c4c05f1d9d751bd58a9ec6500 |
|
BLAKE2b-256 | 356fd082de6adbb4d4b8f5595b9946c2c499b67d10de16a9483f0d82e128dd09 |
Hashes for atomic_bomb_engine-0.21.1-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 61e2e2eefd678ac30612279436c0cdf11fee68f1e46fc93cd26654220ffa0c82 |
|
MD5 | faa41f7d6e3db90f3352c10b05d46252 |
|
BLAKE2b-256 | 2ba3f94d44f680a6a9c38a184e1eb33156f6750062341ac6d57ea2c36ae76d03 |