压力测试脚本改进版本

用于对一个需要登录鉴权的接口进行压力测试,并记录各种响应时间和成功状态。

import datetime
import json
import requests
import logging
import threading
import time
import sys
from time import sleep, ctime

# 配置日志记录
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(thread)d - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 存储响应时间和成功响应
reponse_time = []
OK = []

# 头信息,包括一个固定token和内容类型
headers = {'token':'e835ea9248cadc906909973409e1d9a7','Content-Type':'application/json;charset=UTF-8'}

# 获取Token的函数
def getToken():
    loginR = requests.post('http://127.0.0.1:8000/XXXX/login', headers={'Content-Type':'application/json;charset=UTF-8'}, 
                           data=json.dumps({"username":"123","password":"123456","uuid":"","captcha":"","userType":"","loginPlatform":"m"}), timeout=1000)
    loginR.raise_for_status()  # 如果响应状态码不是 200,就主动抛出异常
    loginS = loginR.json()
    return loginS['token']

# 清空响应时间和成功响应列表,并开始主程序
def urlPackage():
    reponse_time.clear()
    OK.clear()
    num = input('输入需要开启的线程数量:')
    url = 'http://127.0.0.1:8000/XXXX/pageList'  # 地址
    params = {"orderState":"10","page":1,"limit":10,"createtimeStart":"","createtimeEnd":""}
    main(int(num),url,params)

# 定义一个运行脚本的类
class runScript():
    def API(self, url, params):
        try:
            r = requests.post(url, headers=headers, data=json.dumps(params), timeout=1000)
            r.raise_for_status()  # 如果响应状态码不是 200,就主动抛出异常
        except requests.RequestException as e:
            print(e)
        else:
            js = json.dumps(r.json())
            return [r.json(), r.elapsed.total_seconds(), js]

    def circulation(self, url, params):
        res = self.API(url, params)
        reponse_time.append(res[1])
        datas = json.loads(res[2])["msg"]
        status = str(json.loads(res[2])["code"])
        if datas == 'success':
            OK.append(datas)
            logger.info('请求状态为:' + datas + ', 状态码为:' + status)
        else:
            logger.info('请求状态为:' + datas + ', 状态码为:' + status)

# 测试函数,调用 runScript 类的 circulation 方法
def test(url, params):
    Restime = runScript()
    Restime.circulation(url, params)

# 主函数,创建并启动线程
def main(num, url, params):
    start_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    threads = []
    for i in range(num):
        t = threading.Thread(target=test, args=(url, params))
        threads.append(t)
    for t in range(num):
        threads[t].start()
    for j in range(num):
        threads[j].join()
    print("Starting at:", start_time)
    print("All done at:", datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print('响应次数:', len(reponse_time))
    print('正常响应次数:', len(OK))
    print('总响应最大时长:', max(reponse_time))
    print('总响应最小时长:', min(reponse_time))
    print('总响应时长:', sum(reponse_time))
    print('平均响应时长:', sum(reponse_time) / len(reponse_time))
    print('吞吐量:', num / sum(reponse_time))
    urlPackage()

# 程序入口
if __name__ == '__main__':
    headers['token'] = getToken()
    urlPackage()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值