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 文件与目录操作
Dec 24 Python
从零学Python之引用和类属性的初步理解
May 15 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
详解Python3中ceil()函数用法
Feb 19 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
使用python模拟高斯分布例子
Dec 09 Python
pycharm 激活码及使用方式的详细教程
May 12 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 Python
python爬取2021猫眼票房字体加密实例
Feb 19 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
php中目录,文件操作详谈
2007/03/19 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
微信小程序静默登录的实现代码
2020/01/08 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
奇怪的鱼:Weird Fish
2018/03/18 全球购物
优秀毕业生求职推荐信范文
2013/11/21 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
好学生评语大全
2014/05/05 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
考试作弊检讨书
2014/10/21 职场文书
欢迎词范文
2015/01/27 职场文书
承诺保证书格式
2015/02/28 职场文书
清明节寄语2015
2015/03/23 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
导游词之张家界
2019/10/31 职场文书