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实现把数字转换成中文
Jun 29 Python
使用Django的模版来配合字符串翻译工作
Jul 27 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
python编辑用户登入界面的实现代码
Jul 16 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
Python实现播放和录制声音的功能
Aug 12 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
Django如何与Ajax交互
Apr 29 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 第二节 数据类型之数组
2012/04/28 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
Joomla开启SEF的方法
2016/05/04 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
Three.js基础学习教程
2017/11/16 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
vue实现图片上传功能
2020/05/28 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
Python 流程控制实例代码
2009/09/25 Python
Python实现的归并排序算法示例
2017/11/21 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
作为网站管理者应当如何防范XSS
2014/08/16 面试题
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
物理教育专业求职信
2014/06/25 职场文书
房屋买卖协议样本
2014/11/16 职场文书
大学生自我评价范文
2015/03/03 职场文书
公司奖励通知
2015/04/21 职场文书
研讨会通知
2015/04/27 职场文书
监守自盗观后感
2015/06/10 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
pandas数值排序的实现实例
2021/07/25 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript