使用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.3-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 686d1dd88b893df49f529368b08db2318c138e9299ba803e0543571c7922859d |
|
MD5 | 707f69d7c9128f41e38b7c1b75c6a11f |
|
BLAKE2b-256 | e07bd6ad038eb853355dfe302ae09ea54755763571ace43dba8a1860683edc8e |
Hashes for atomic_bomb_engine-0.28.3-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fca23c145152adc9ef806c5a7253f3f3f9e93f756ea2900cbef1b6cdb1c103f5 |
|
MD5 | 41561c002ca7cccf2d219c0253a24eab |
|
BLAKE2b-256 | 359637760020e074442ba31646616276230ea4b67f45138e47c802ffa4804d01 |
Hashes for atomic_bomb_engine-0.28.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 45753a6484a6de6b4b5f34cbc7b5b3aa253979e0dc18f79cce66fd5fe2e7da2b |
|
MD5 | 8b85f5affd8139cf3843ba53cf759bb3 |
|
BLAKE2b-256 | b5558a44be5e873236a1a913fbf30f16e628571269491628d93329f221569c12 |
Hashes for atomic_bomb_engine-0.28.3-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | da84c1aba6b0264307fe585ebe27d528e587b138ca1fdb775c1a31842430e417 |
|
MD5 | 98c18f7f064cc52ed5c2783764e037bb |
|
BLAKE2b-256 | 405844b6848e266651f2c5747231110e140637a0806c71ff895471e90bff1c8d |
Hashes for atomic_bomb_engine-0.28.3-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fbcd67e73e9f2f93e0e42ebea76be09cf651bbfb2b91aed2359b19e4c85a49ef |
|
MD5 | 6f230f83177c1d170150ce00c087b4cc |
|
BLAKE2b-256 | bfe3e06a91b19581dc14759e241fad4e35f8409dd4fb01c22f0e5897b2dda6ac |
Hashes for atomic_bomb_engine-0.28.3-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bc342b0cfe764b746278843edcfc1e20bf01acd2ac699d3e8f68b0e6268a5356 |
|
MD5 | 0bf0bb784cacc21bb0d42ebafef93309 |
|
BLAKE2b-256 | 7c75c07967c4debc2cb63f92c0d81a3e674a1bfab1903a06a1d3ca9719ae9db4 |
Hashes for atomic_bomb_engine-0.28.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8fed351290de1970e25dbfd11130f42f14b464ed30ec6d2ea2c6f7588032c6df |
|
MD5 | 4b9878e46e661ec888b3853aade1f9c7 |
|
BLAKE2b-256 | d7c17eb9498337fb64add291bf73d66625297bb3a67d4d3f59b389bb4d51809d |
Hashes for atomic_bomb_engine-0.28.3-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d841b32297cd96cfa82724634a0212ef4857a5d603dbd7139a8431c93698c835 |
|
MD5 | 1bd945dcd33afa0c3494a8aa8b4b4ab3 |
|
BLAKE2b-256 | 8437fe1a565cc94726c6c70447872b63956d4f570a385610b21c16da3548d281 |
Hashes for atomic_bomb_engine-0.28.3-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4870377e51155547c28b7f8fdca41308f449da6abb650ae5747943c22f7be750 |
|
MD5 | 8fe88e6341ec13f680f4988db8a435e0 |
|
BLAKE2b-256 | c4e08a3632f474e9d8f51707cc3537d9cac2a8b5482cc4a734e7322c59bcef85 |
Hashes for atomic_bomb_engine-0.28.3-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 49b0d89a34b4464257828e7463b23ab3382a74a35d0be004a8d1cb86e6414397 |
|
MD5 | b2a4b12663b8e9e088260c072056c071 |
|
BLAKE2b-256 | dc15f087da2c9b22d4d942aa2b882dd310e9ef7d8894feb2196d6f8038806918 |
Hashes for atomic_bomb_engine-0.28.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 56ee2a0b1c618abbea59d73f4c8308caa245930d3dfb8bfc34feffb9db67f485 |
|
MD5 | 4e9062bee7588742e56732a60e42dab2 |
|
BLAKE2b-256 | b34e922db25f7550a366e54131ff8c07da7e1ab0ffb10789a3c0278d62679762 |
Hashes for atomic_bomb_engine-0.28.3-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 70dff51da3067c68bd2985fb3a0206589c65ce550118ed9f32c9406ce27040d9 |
|
MD5 | e9ca42491a68d6981378aee37ecead60 |
|
BLAKE2b-256 | 7469bf3cab3032797a73414215057d77d8ae17656e74d0e6a0c3958f0d8eea26 |
Hashes for atomic_bomb_engine-0.28.3-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f8e8a636e0994cc7f8ef4d32e4b16ff05b090709ec6e7ba8e96a2b75cea183e8 |
|
MD5 | 1d42a3e84a0a9c397d3a6b9623e26034 |
|
BLAKE2b-256 | 6b7bf6114a54edb33ddbaf8db414497e3a17ba8a33d1ad00faf2a51a89ee805b |
Hashes for atomic_bomb_engine-0.28.3-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0e8903df40e4c4acebeec17cf6cd14d816d579f5af5633a248cc2259c7b15533 |
|
MD5 | 91e70bfaf7cdd53580378d6017370716 |
|
BLAKE2b-256 | a731f76e5140cfd9d746b93b9e5e4dfa6d01a4091d2941eae1895d71a47a1228 |
Hashes for atomic_bomb_engine-0.28.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3cfcff875ada1c7f760ce52bbfd9e81739a36631fba13203489737cb1a8d6ae8 |
|
MD5 | 3283ed4c6427f11b4a639d71c0d34767 |
|
BLAKE2b-256 | d9a357fb1839708ec7fbad4dfaa161142037eb095c7f640025aca11593d23b35 |
Hashes for atomic_bomb_engine-0.28.3-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e230b8975feb74dd7c8e1074b9e8add6221fd9721ea3b006c14b930d0d4065a4 |
|
MD5 | 6702d0f875fcdb82ae5a11d399690967 |
|
BLAKE2b-256 | 945b4610b3022455d952c4ed27f28cfaf5c710b48270d5a3b5d3a9b2961c0d6c |
Hashes for atomic_bomb_engine-0.28.3-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3b3b3a3b5e6f95f66d6672c818c48afd30f9a70d1638073d57b6a553f98f179e |
|
MD5 | 3252308d7f763d2c5aeaed71d82cf654 |
|
BLAKE2b-256 | 463fe70ebaafba749bb612e9ab55c798ea828015e4d895e4d7327ef85388900e |
Hashes for atomic_bomb_engine-0.28.3-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7a0c6a1b3730584e2eddaf46b402eec816a2a11457f406da504648ba08ac40fd |
|
MD5 | 4d403333a9a871e4ad13920166fa9966 |
|
BLAKE2b-256 | ab28e405e226ba40d27c6c52fef162383dc6741f5a5648acdbcc44502ceb3def |
Hashes for atomic_bomb_engine-0.28.3-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d78270151727f3639a9c7357fc9909f9133c1787e97b1f644b1ac0133c18af3 |
|
MD5 | 149df1077ba47f3b4de9d3912d3df995 |
|
BLAKE2b-256 | ee865b80060b90cac1e8eb855bcb21720291a47a7050195827dce50ea998b609 |
Hashes for atomic_bomb_engine-0.28.3-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e0450f6f590eb4b1dc9a4653fe9e60faafadca301ff388a1805981e280deaef2 |
|
MD5 | e2235a982c0b56b94a0a7a92657e03ca |
|
BLAKE2b-256 | 23b50a62892b7e28feb762f7be585e5b1cfdb8ab03c2efd2700de5016b24e527 |