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中的lambda表达式的用法
Aug 28 Python
Python中模块string.py详解
Mar 12 Python
Python实现的生成格雷码功能示例
Jan 24 Python
python pandas 如何替换某列的一个值
Jun 09 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
elasticsearch python 查询的两种方法
Aug 04 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
python中p-value的实现方式
Dec 16 Python
Python中bisect的使用方法
Dec 31 Python
Python无损压缩图片的示例代码
Aug 06 Python
Python的轻量级ORM框架peewee使用教程
Feb 05 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正则的Unknown Modifier错误解决方法
2010/03/02 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
Python中os.path用法分析
2015/01/15 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
临床医学应届生求职信
2013/11/06 职场文书
求职简历推荐信范文
2013/12/02 职场文书
公司离职证明范本
2014/01/13 职场文书
青年教师典范事迹材料
2014/01/31 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
工程合作意向书范本
2015/05/09 职场文书
就业意向书范本
2015/05/11 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
Python利用zhdate模块实现农历日期处理
2022/03/31 Python