使用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.4-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6bc0ed881f5a174ef91b806fd0e18adc3cffe08b5d445002818b6bdba25b67ef |
|
MD5 | a3f85c171daba0eb0bb224a623abbd7d |
|
BLAKE2b-256 | c6ae9e338b34d995fef1fa9396326b54b74a5fc68a7a7b9e45ca6654accfec2e |
Hashes for atomic_bomb_engine-0.28.4-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3cecbfc0844fc4adbcd5bf09b6f1e34b725c75891c16a6fd3d812716bb39b6fd |
|
MD5 | 00835bd84c4684796459444568a47dc9 |
|
BLAKE2b-256 | 4eed22365172c48f2f9e2899e66035d80221f871d37d1d39526590a5c709aa2b |
Hashes for atomic_bomb_engine-0.28.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1411c4d25741cffb0473fc1f46321bdf85c4484a3444ea0615e8e3025ee693d6 |
|
MD5 | 78e7290ecc399984841e03a879f463cc |
|
BLAKE2b-256 | fa3f57814ffc99008800e975e223411505647fdc34696c25f76f609f94a8ab32 |
Hashes for atomic_bomb_engine-0.28.4-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d828c574a0bc580cc5551638d46ceb7c8e4126c9132baea0191783e4bcf9d806 |
|
MD5 | 4a1d7944086cb51352fe30e68d5bdc4a |
|
BLAKE2b-256 | 263d5bb48548c4d6ef287332408be18d3c475a2662040ea70c539eac9234662e |
Hashes for atomic_bomb_engine-0.28.4-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8739444f965ab9c510a680a63b5a35693b5d9f9c4aa1d8df282dc92c7cbb69c0 |
|
MD5 | 9981084867f391b81baa78f7d0944ff5 |
|
BLAKE2b-256 | 120beccb405b727cc55eedc3209fffc81de6a11d97ac0b28db96b11b71c0de2a |
Hashes for atomic_bomb_engine-0.28.4-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5f0ddc9475f579ffde9653f0f616e1bfb8ec3814493e063a8231333d55e71885 |
|
MD5 | f74f8a6be93ddf9cf576f1529c5c40a7 |
|
BLAKE2b-256 | 43f1ad0a37b418d0cd8922699df60137518f5d38f48f9e9f891e663c59c09863 |
Hashes for atomic_bomb_engine-0.28.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | eab423d44c1da416272c0c1f0c23151db87299a3a3683064a02c1483f158f658 |
|
MD5 | 1308d661251f33b773ef9ca2ca0e606c |
|
BLAKE2b-256 | 344444cf33ffed8133db1eca64353fb8691d5ec1a9e5eef2af911e52133d5b10 |
Hashes for atomic_bomb_engine-0.28.4-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4d2d88276f0d3b852fc183c6711cdefef6319e2e1ad591c00840dd1f78b41c3e |
|
MD5 | 3fd0a12603a5ef0f4051222acf9f35dc |
|
BLAKE2b-256 | e90d518cc7a77212479bf223e68a5132db22000a123c435fbd79a075986d0cfd |
Hashes for atomic_bomb_engine-0.28.4-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bf302703bb56c0000f0a5d5467dae5b49b2298338a378698c08d13c2eb09eef4 |
|
MD5 | e0788b6e43be825fe6b8cf9f32585594 |
|
BLAKE2b-256 | 1583c02674706f8f02ac40849546a38ec819403b9cf9da9b23bd6fd723057aaa |
Hashes for atomic_bomb_engine-0.28.4-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5a509984834f5dfaf7c140c772912caa61e6305d142aef1b909cf1ed8dbe24cc |
|
MD5 | 83a7e7611d130bed3be8b86a6bd82797 |
|
BLAKE2b-256 | 805bbc2b7c342c31dd670b02a9d6d251af058c7e92802565b019317bd3907322 |
Hashes for atomic_bomb_engine-0.28.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ef406b0e4becbd92440a55cae9ffbfc56e607178644e71bdee91a5999496b11e |
|
MD5 | a62bf223fbfbdf1ef75d16f4c01a7af8 |
|
BLAKE2b-256 | f13395a3792ebf4bdede8d993da8d3e0ce2769cd1a33a9b37773e55526344256 |
Hashes for atomic_bomb_engine-0.28.4-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2218c90bd106d7d774a8fcca499ab0d20700623c02bb73dc5eadec1de8534cd |
|
MD5 | 38fd25d47c4a80e351018ecda3dc72a4 |
|
BLAKE2b-256 | 9c1fa60c1e75c928268d55f1979045ec7887ed5233656f1c93f67f564a7a4393 |
Hashes for atomic_bomb_engine-0.28.4-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dd8b09d0cbdb3917e528616b1f8575350392aef6df719c65ce7b22426e098b4d |
|
MD5 | 649130bd82b9a0aa21c0e982a64974d6 |
|
BLAKE2b-256 | 23558ddcd7e04efbeb6bec2171ecebdc0895d06f03bf8e49f8ca66b792b6720b |
Hashes for atomic_bomb_engine-0.28.4-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 770777b08df5b37d9f9c4cb8658ab099f28317255db1f3be06dab33cb4d6d955 |
|
MD5 | d45cc3bff2e6500152f9c9e9d24a6d96 |
|
BLAKE2b-256 | a1a9b7df283b2b54e0e48ada705eb888984ac0572ff953969fe0107b996595ef |
Hashes for atomic_bomb_engine-0.28.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c959e4ba16f4fc09fa053f8b8df698861bf3316df3ba889e0abccb6559f275f1 |
|
MD5 | 98933cdbd3ba875d1a77a27678b6b6e6 |
|
BLAKE2b-256 | 54713b7d4b4b49bbf48f239f5f68c92e167b23dfe26bb645e23cb6e3fb8800aa |
Hashes for atomic_bomb_engine-0.28.4-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f49dbcbe376c2feb27753d1aeedb4fe3b6c37bd498876ef9fdcbbbfe11d0dea4 |
|
MD5 | c2d2549b46167d8586ef9157cc2733eb |
|
BLAKE2b-256 | ee9d8b1d921193aa2b77c14ae4f99768e52025baa0b7b1bbef22e582db42491e |
Hashes for atomic_bomb_engine-0.28.4-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b9a391cb42b053c007032715f7514131219af9fc82a920c3d08e3708afab13c9 |
|
MD5 | 780e11c66ef4b4350bb6eece714c30f4 |
|
BLAKE2b-256 | 06a67ff31565012db26aa6e67c20d64d4a7ace5239943ac6b6522a6a687187fb |
Hashes for atomic_bomb_engine-0.28.4-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a819fb23edd9f94cf6c77c2be25bf59f5408b9e6eb0e5c56577b48afd9926c9f |
|
MD5 | 242d8523c51b8f9ac8ef142c2c7e612b |
|
BLAKE2b-256 | f5c0c2db86300e3b5471832c3e864af8ddb2b03b6fcecb7b100379fd94e217df |
Hashes for atomic_bomb_engine-0.28.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9a52dea182e3ed865f6feed83e3c0f9086da42596e338971b996c89647afa48a |
|
MD5 | 86f85db33014cd88946f65e6128974ed |
|
BLAKE2b-256 | 5ddc8ec5e94bf19edfa01996690db855e82f647caeb7db6df661245b15cba805 |
Hashes for atomic_bomb_engine-0.28.4-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 91e60c25efa1cd84f2bdccde4c3199265ac4eb43f0951a24026f381ca2fc21a5 |
|
MD5 | 25a50aec25f0715e94d6bfe93f07709f |
|
BLAKE2b-256 | 48535a1cc15afca0ec3651d27d5c2a7d5b4094b40caa78db7c9a007345d9b357 |