python实现接口并发测试脚本


Posted in Python onJune 25, 2019

常用的网站性能测试指标有:并发数、响应时间、吞吐量、性能计数器等。

1、并发数

并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力。

2、响应时间

响应时间是一个系统最重要的指标之一,它的数值大小直接反应了系统的快慢。响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间。

3、吞吐量

吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标。
QPS(每秒查询数)、TPS(每秒事务数)是吞吐量的常用量化指标,另外还有HPS(每秒HTTP请求数)。
跟吞吐量有关的几个重要是:并发数、响应时间。
QPS(TPS),并发数、响应时间它们三者之间的关系是:
QPS(TPS)= 并发数/平均响应时间

4、性能计数器

性能计数器是描述服务器或操作系统性能的一些数据指标,如使用内存数、进程时间,在性能测试中发挥着"监控和分析"的作用,尤其是在分析统统可扩展性、进行新能瓶颈定位时有着非常关键的作用。
Linux中可以使用top或者uptime命令看到当前系统的负载及资源利用率情况。
资源利用率:指系统各种资源的使用情况,如cpu占用率为68%,内存占用率为55%,一般使用"资源实际使用/总的资源可用量"形成资源利用率。

压测脚本(下单的接口):

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import requests,time,json,threading,random

class Presstest(object):
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    'Content-Type': 'application/json; charset=UTF-8',
  }
  def __init__(self,login_url,press_url,phone="1376193000",password="123456"):
    self.login_url = login_url
    self.press_url = press_url
    self.phone = phone
    self.password = password
    self.session = requests.Session()
    self.session.headers = self.headers

  def login(self):
    '''登陆获取session'''
    data = data = {'t': int(time.time() * 1000), 'userName': self.phone, 'passWord': self.password}
    res = self.session.post(self.login_url,data=json.dumps(data))
    XToken = res.json().get('data').get('companyToken')
    self.session.headers['X-Token'] = XToken

  def testinterface(self):
    '''压测接口'''
    self.session.headers['X-UnionId'] = 'of6uw1CUVhP533sQok'
    data = {"id": int(''.join(str(random.choice(range(10))) for _ in range(10))),
        "openId": "oMr0c5LGJjlTc", "addressId": 10, "shipType": "SELF", "totalAmount": 5,
        "receivable": 5, "carts": [
        {"amount": 1, "barcode": "1234567890", "skuId": 1, "spec": "34", "itemAmount": 5, "price": 0,
         "cover": "xxxx-dd.oss-cn-shanghai.aliyuncs.com/dfc91fd067ac464c096c90af33a196a5.png",
         "name": "沙宣洗发水", "packingType": "瓶", "placeOfOrigin": "上海", "productId": "310153323435134976",
         "retailPrice": 5, "suitableAge": "1-100"}], "formId": "the formId is a mock one", "comments": "aa"}
    global ERROR_NUM
    try:
      html = self.session.post(self.press_url, data=json.dumps(data))
      if html.json().get('code') != 0:
        print(html.json())
        ERROR_NUM += 1
    except Exception as e:
      print(e)
      ERROR_NUM += 1

  def testonework(self):
    '''一次并发处理单个任务'''
    i = 0
    while i < ONE_WORKER_NUM:
      i += 1
      self.work()
    time.sleep(LOOP_SLEEP)

  def run(self):
    '''使用多线程进程并发测试'''
    t1 = time.time()
    Threads = []

    for i in range(THREAD_NUM):
      t = threading.Thread(target=self.testonework, name="T" + str(i))
      t.setDaemon(True)
      Threads.append(t)

    for t in Threads:
      t.start()
    for t in Threads:
      t.join()
    t2 = time.time()

    print("===============压测结果===================")
    print("URL:", self.press_url)
    print("任务数量:", THREAD_NUM, "*", ONE_WORKER_NUM, "=", THREAD_NUM * ONE_WORKER_NUM)
    print("总耗时(秒):", t2 - t1)
    print("每次请求耗时(秒):", (t2 - t1) / (THREAD_NUM * ONE_WORKER_NUM))
    print("每秒承载请求数:", 1 / ((t2 - t1) / (THREAD_NUM * ONE_WORKER_NUM)))
    print("错误数量:", ERROR_NUM)


if __name__ == '__main__':
  login_url = 'https://ds.xxxxx.com/sys/sysUser/login'
  press_url = 'https://ds.xxxxx.com/weshop/order/checkout'
  phone = "1376193000"
  password = "123456"
  
  THREAD_NUM = 1     # 并发线程总数
  ONE_WORKER_NUM = 5   # 每个线程的循环次数
  LOOP_SLEEP = 0.1    # 每次请求时间间隔(秒)
  ERROR_NUM = 0      # 出错数
  
  obj = Presstest(login_url=login_url,press_url=press_url,phone=phone,password=password)
  obj.login()
  obj.run()

输出结果:

===============压测结果===================
URL: https://ds.xxxxx.com/weshop/order/checkout
任务数量: 1 * 5 = 5
总耗时(秒): 1.9810078144073486
每次请求耗时(秒): 0.39620156288146974
每秒承载请求数: 2.5239678327547805
错误数量: 0

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用python实现xml与数据库读取转换的方法
Jun 17 Python
Python实现登录接口的示例代码
Jul 21 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
Python如何批量生成和调用变量
Nov 21 Python
Python基于Faker假数据构造库
Nov 30 Python
拒绝盗图!教你怎么用python给图片加水印
Jun 04 Python
Python常遇到的错误和异常
Nov 02 Python
Python实现EXCEL表格的排序功能示例
Jun 25 #Python
python实现动态创建类的方法分析
Jun 25 #Python
python pandas写入excel文件的方法示例
Jun 25 #Python
python多线程http压力测试脚本
Jun 25 #Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 #Python
对PyQt5的输入对话框使用(QInputDialog)详解
Jun 25 #Python
如何使用Python标准库进行性能测试
Jun 25 #Python
You might like
php 缩略图实现函数代码
2011/06/23 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
php并发加锁示例
2016/10/17 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
PHP实现简单登录界面
2019/10/23 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
手机端转换rem适应
2017/04/01 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
Python切片知识解析
2016/03/06 Python
python中正则的使用指南
2016/12/04 Python
Python callable()函数用法实例分析
2018/03/17 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
护士专业推荐信
2013/11/02 职场文书
八年级历史教学反思
2014/01/10 职场文书
项目总经理岗位职责
2014/02/14 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
如何在python中实现ECDSA你知道吗
2021/11/23 Python
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏