问题:如何对接口进行压力测试?测试并发数能支持多少?
解决:使用python脚本进行异步请求查看每次消耗时间;使用ab命令进行测试
方法:
1、ab命令进行压力测试
#!/bin/bash
echo "开始压测..."
ab -n 3 -c 3 -p {"phone": "1232324"} -T application/json -H "Authorization: Bearer eyJhbGciOiJIUzIrE" https://x.com/api/send/smscode > ab_result.txt
echo "压测完成,结果已保存到 ab_result.txt"
2、异步请求脚本
import asyncio
import aiohttp
# 异步POST请求函数
async def fetch_post(session, url, headers, data):
try:
async with session.post(url, headers=headers, json=data, timeout=10, ssl=False) as response:
status = response.status
text = await response.text()
return url, status, text
except Exception as e:
return url, str(e), 0
# 主函数,创建任务并运行
async def main():
# 自定义请求头
headers = {
'Authorization': 'Bearer eyJhbGciOiJIUzIrE',
'Content-Type': 'application/json'
}
# 要发送的数据(JSON 格式)
payload = {
'phone': '9de2a041-cb82-4c=_=#cLE4NZTXb8fB9OYb36typA=='
}
# 请求的 URL 列表
urls = [
'https://x.com/api/send/smscode'
]*3
async with aiohttp.ClientSession() as session:
tasks = [fetch_post(session, url, headers, payload) for url in urls]
results = await asyncio.gather(*tasks)
# 打印结果
for result in results:
print(f"URL: {result[0]} | Status: {result[1]} | Response: {result[2]}")
if __name__ == '__main__':
asyncio.run(main())