使用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.37.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 24ae999c4804475b98b736f4063e741f3fa9b5c287e00c3d78d89fd46db0860b |
|
MD5 | 069a1783f2d08e81f57b89f5accc79d5 |
|
BLAKE2b-256 | f7249b2e9127207b9a46446776c013afa0cf205d208ca24e8c4355589f079b4f |
Hashes for atomic_bomb_engine-0.37.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | be97ac3e9285e6e01c298186cd2920e191fad4f18adebf73518635ab77ec224a |
|
MD5 | 533369f59d03fea40d7cd056194354d6 |
|
BLAKE2b-256 | 39fcc064173af30b2030c1fa77604802ec33eb53ecb0cab54fd97954e004a59e |
Hashes for atomic_bomb_engine-0.37.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ecb4a4d5987d3e0ac7052183395311b56a9f255feeaf9d571f70f8b776c67112 |
|
MD5 | b9e3f94c61721a5bef1ff4d91fa4f275 |
|
BLAKE2b-256 | 7436a0de10cfdabc89cd518f7bbbe029b29b91cbd3c069dca5a1454e89a94eb5 |
Hashes for atomic_bomb_engine-0.37.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6bfc7ce4a8ba9b565af66a76338b00185a2d5c2c7693771332640d5e0b5cef71 |
|
MD5 | 611625737b6a7a43d6ce3525754f7698 |
|
BLAKE2b-256 | 8dfcf276c5ca9da9bc4cfbd95d9d28fe08501b5d134bb5f038994f3646541ab5 |
Hashes for atomic_bomb_engine-0.37.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f271829400ebb0d7e30862610cce25d920ddc761a74edfa31c3b2aff13d128f3 |
|
MD5 | 4930c762a754de596f8d212f0589b165 |
|
BLAKE2b-256 | 58ea6f1c594ddf892e40105aef559ae15b1195c56f4097682e8355d40407082e |
Hashes for atomic_bomb_engine-0.37.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dc978df415340363ff5615352fcfc517dd67e193e2bd098a19128064cfaa46b0 |
|
MD5 | 4d7045225d90dd476a8f73e1f2ade9ab |
|
BLAKE2b-256 | 1a61f463f044c23aa2486c23cc4bf5001eb082ca4d7b5d10b3d1ce83b5d6cb40 |
Hashes for atomic_bomb_engine-0.37.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4b00c51f789efc731adea9ae31c8089532f373dee25b467e199b01cae7c71047 |
|
MD5 | 45aad82ed79316f49ac90bd91396509b |
|
BLAKE2b-256 | 8cd797764b80e451413574c31e41a9ccdc8faa53738cb55a10f6dc96bf0ce60c |
Hashes for atomic_bomb_engine-0.37.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c0d2d070e574dfebd877431bb379c98a6b7c77aff977a5b0a9859e02cac0b721 |
|
MD5 | 99fd0bb20e6097f8067f8a43f7e60199 |
|
BLAKE2b-256 | 96be90f2feedfc3e7ccc8326f8b11292f05eb24a9970831b82a43d1668283bef |
Hashes for atomic_bomb_engine-0.37.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b496d575f4afb0a7b76486121693ca43c9d16bf27386ba080077000763650dae |
|
MD5 | ab5bd2eff2eb50a21e08a2efc8d8f6fb |
|
BLAKE2b-256 | c75a4fd25db74636d4a3ab04394943ca38e2fe7f39a19795a4f5b545b6269e31 |
Hashes for atomic_bomb_engine-0.37.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c77c1819484addac460bacc17bcd81dd8ec3050da8649679a2cd15b5e464404e |
|
MD5 | a3b23dee03b2747a7b4b82b279ffa3f5 |
|
BLAKE2b-256 | 29bf0a74e27eeee969f9e2ac30acac12586936ae1551c4c005998b9ee884ce06 |
Hashes for atomic_bomb_engine-0.37.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a4bcb4d20b3a27bcdb25ef4465110077af0df0cb9a96b7390eb64a81b6235f34 |
|
MD5 | 62ef63756c8a026992f04491d15cb1b2 |
|
BLAKE2b-256 | 06ea7e9310052f2d139c2769f79d12ffb92f2e6bbf65805185139c17b45e41f7 |
Hashes for atomic_bomb_engine-0.37.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ee9e3d7ca075e162149c7829e6264d126922258367fbdf1633de425dee82f4bf |
|
MD5 | c75766f264911633704943fb1e289a18 |
|
BLAKE2b-256 | aacd0fed153573a6da463267eb417f7d9d694f51a820f2e981a1ba85a3881c8b |
Hashes for atomic_bomb_engine-0.37.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6d730a44afc9a6a6197057cd458d195ce71d063d67dcadbe7b4963839c4e47d1 |
|
MD5 | 14eec123b05cc4ad764b23c6fecff1f6 |
|
BLAKE2b-256 | f91e8af274593aa630cf0690dcda38308db4f885a43aa35f8c1054531c51af2f |
Hashes for atomic_bomb_engine-0.37.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 662a9f0a8626a877d885fa00ad379c9ac117d0c1a885d045577daf0085f07bd6 |
|
MD5 | 85b7dcd84a6863752b08b918cfc5459f |
|
BLAKE2b-256 | 6a6a516a2bec35720c416636055c69caff7a5c863b604cf35eecab3b05231250 |
Hashes for atomic_bomb_engine-0.37.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f02e30a7be5d61fb4e431c33dfa03e55bd3a14bb6f0f8956f4c355db300ee7fb |
|
MD5 | 21da1bc23aa8df1a7ea6d5cff65ac2b0 |
|
BLAKE2b-256 | 7011a28c7c65ff18890878349e9de9003d20fe3c721e041639dc27b202211353 |
Hashes for atomic_bomb_engine-0.37.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f4cb22d8884ab3a8c3790bec0df3058ef28b2edab75c4d9ed7c1572b0298e4ba |
|
MD5 | e9fd5a21929c257831fb128d24cfbea9 |
|
BLAKE2b-256 | f776975d24a561b195108de002a4a5dbd6cd2a5324bf0a7bbbd509bf69e4d47f |
Hashes for atomic_bomb_engine-0.37.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6cfe355cea83f7d23c9074517b8cdb9f753c023e01e8b81651ef6abd99a2601b |
|
MD5 | db151029f2401a59ada0228265a8903c |
|
BLAKE2b-256 | 8ba7ec93a46fa35f8d38eb5af681d5a5613f052cdb33d917968717b9363d51dd |
Hashes for atomic_bomb_engine-0.37.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7075673ffa4a2464aef0ab6238945de3466af24e614426ed2c04729bbe7184ba |
|
MD5 | f011717c994e24d46a040b2b6dcc7ab8 |
|
BLAKE2b-256 | 91a3519d327fb1edb4776aac534691f4168ad24d77d3bffd7a12b72b4df0cf6d |
Hashes for atomic_bomb_engine-0.37.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 15542c40dc5fbccd48b4c6f0a9b28a4ebdc3d13bbfe2e6052237bb88ca24db7b |
|
MD5 | 4fd96b87e784553183e63239a5cfb20d |
|
BLAKE2b-256 | d46de8f65c170fd30295847af9d0a8f7dbf37ab3d8d2474598ea5131fb8d08cf |
Hashes for atomic_bomb_engine-0.37.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bef394eb29dcf4b242b281d8786d20f70d07c9cf690be317deb05a772d457c70 |
|
MD5 | 06a6bb5c9ac9ceeae3961b3021eca16a |
|
BLAKE2b-256 | 07ebc9f965fe5d70852d3c96cb6488445a45662d38edaa037a5539213da736c0 |