python 写一个性能测试工具(一)


Posted in Python onOctober 24, 2020

国庆重新学习了一下go的gin高性能测试框架。

用JMeter来测试gin与flask接口的性能,差别很大。

为什么我自己不尝试写一个性能工具,性能工具的核心就是 并发 和 请求。

请求可以选择Python的requests库。

并发可以通过python的 进程、线程、协程模拟。

这么一想,也不是很难了,上手撸一个。

依赖库

requests==2.22.0
gevent==20.9.0
numpy==1.19.2

requests 大家并不陌生,HTTP请求库。

gevent是python协程库,通过协程模拟并发更节省资源,在同样配置下能模拟更多的并发。

numpy 是python的数据计算库,提供大量组数和矩阵运算,这里用它求列表的平均值。

实现脚本

好了,接下来开始上手写代码了。

from __future__ import print_function
import time
import gevent
from gevent import monkey
monkey.patch_all()

import requests
from numpy import mean


users = 10 # 用户数
numbers = 100 # 请求次数
req_url = "http://127.0.0.1:8080/user/tom" # 请求URL

print("请求URL: {url}".format(url=req_url))

print("用户数:{},循环次数: {}".format(users, numbers))

print("============== Running ===================")

pass_number = 0
fail_number = 0

run_time_list = []

def running(url):
  global fail_number
  global pass_number
  for _ in range(numbers):
    start_time = time.time()
    r = requests.get(url)
    if r.status_code == 200:
      pass_number = pass_number + 1
      print(".", end="")
    else:
      fail_number = fail_number + 1
      print("F", end="")

    end_time = time.time()
    run_time = round(end_time - start_time, 4)
    run_time_list.append(run_time)


jobs = [gevent.spawn(running, req_url) for _url in range(users)]
gevent.wait(jobs)

print("\n============== Results ===================")
print("最大:    {} s".format(str(max(run_time_list))))
print("最小:    {} s".format(str(min(run_time_list))))
print("平均:    {} s".format(str(round(mean(run_time_list), 4))))
print("请求成功", pass_number)
print("请求失败", fail_number)
print("============== end ===================")

设计思路

在JMeter中创建线程组有两个参数 线程数和 循环数,即 用户数 和请求数,设置多少个用户,每个用户用户跑多少次,用户数通过协程模拟,每次用户运行次数通过for循环实现。

至于请求就比较简单了,直接通过requests发送请求。通过判断影响的状态码是否为200来判断是否成功,通过分别计算成功和失败的请求个数。

关于请求时间统计,在每次请求前后获得当前时间戳,然后计算时间差就是单个接口的调用时间。最大,最小,平均通过计算就可轻松的得到。

> python3 ab.py

请求URL: http://127.0.0.1:8080/user/tom
用户数:10,循环次数: 100
============== Running ===================
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
.
============== Results ===================
最大:    0.0352 s
最小:    0.0036 s
平均:    0.0204 s
请求成功 1000
请求失败 0
============== end ===================

后续

把ab.py脚本做成 ab 命令行工具。

支持更多的请求类型(get/post/put/delete)和参数。

更多统计维度,吞吐量、吞吐率

增加启动时间,思考时间等

...

以上就是python 写一个性能测试工具(一)的详细内容,更多关于python 性能测试工具的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中删除文件的程序代码
Mar 13 Python
zbar解码二维码和条形码示例
Feb 07 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
安装Python的web.py框架并从hello world开始编程
Apr 25 Python
介绍Python中的__future__模块
Apr 27 Python
django 发送手机验证码的示例代码
Apr 25 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
Python猜数字算法题详解
Mar 01 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
基于python实现检索标记敏感词并输出
May 07 Python
用python实现名片管理系统
Jun 18 Python
Python之qq自动发消息的示例代码
Feb 18 Python
Django admin组件的使用
Oct 24 #Python
Python数据可视化常用4大绘图库原理详解
Oct 23 #Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 #Python
python 带时区的日期格式化操作
Oct 23 #Python
Python可视化工具如何实现动态图表
Oct 23 #Python
python 匿名函数与三元运算学习笔记
Oct 23 #Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 #Python
You might like
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
prototype1.4中文手册
2006/09/22 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
python黑魔法之参数传递
2016/02/12 Python
Python os.access()用法实例
2019/02/18 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python matplotlib实时画图案例
2020/04/23 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
selenium如何定位span元素的实现
2021/01/13 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
shell的种类有哪些
2015/04/15 面试题
居安思危观后感
2015/06/11 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL