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采用socket模拟TCP通讯的实现方法
Nov 19 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
python实现五子棋小程序
Jun 18 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
python修改文件内容的3种方法详解
Nov 15 Python
基于python调用psutil模块过程解析
Dec 20 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
Python self用法详解
Nov 28 Python
用Python进行栅格数据的分区统计和批量提取
May 27 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 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求两个文件的相对路径
2013/06/20 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
js 文件引入实现代码
2010/04/23 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python中的推导式使用详解
2015/06/03 Python
python一键升级所有pip package的方法
2017/01/16 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
市场部专员岗位职责
2013/11/30 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
人事档案接收函
2014/01/12 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
护理实习生带教计划
2015/01/16 职场文书
商超业务员岗位职责
2015/02/13 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python