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实现把回车符\r\n转换成\n
Apr 23 Python
Python单例模式实例详解
Mar 01 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 Python
用python实现对比两张图片的不同
Feb 05 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
C++和python实现阿姆斯特朗数字查找实例代码
Dec 07 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 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抓取页面与代码解析 推荐
2010/07/23 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
Jquery元素追加和删除的实现方法
2016/05/24 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
浅谈webpack和webpack-cli模块源码分析
2020/01/19 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
windows下python和pip安装教程
2018/05/25 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
Python实现FTP文件传输的实例
2019/07/07 Python
Python 多进程原理及实现
2020/12/21 Python
华为慧通面试题
2012/09/11 面试题
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
见习期自我鉴定
2013/11/07 职场文书
个人简历自我评价
2014/01/06 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
运动会通讯稿100字
2015/07/20 职场文书
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS