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 相关文章推荐
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
python3.5使用tkinter制作记事本
Jun 20 Python
python绘制双柱形图代码实例
Dec 14 Python
Python解决八皇后问题示例
Apr 22 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python实现全排列的打印
Aug 18 Python
详解Python locals()的陷阱
Mar 26 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
python自定义函数def的应用详解
Jun 03 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
利用Python实现Windows定时关机功能
2017/03/21 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
python中返回矩阵的行列方法
2018/04/04 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
女性时尚在线:IVRose
2019/02/23 全球购物
.net软件工程师面试题
2015/03/31 面试题
经济与贸易专业应届生求职信
2013/11/19 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
股份转让协议书
2014/04/12 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
迎新生标语大全
2014/10/06 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
车辆管理制度范本
2015/08/05 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers