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正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
python3编码问题汇总
Sep 06 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
PyTorch基本数据类型(一)
May 22 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Python常用特殊方法实例总结
2019/03/22 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
大学生最新职业生涯规划书范文
2014/01/12 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
2015年财政局工作总结
2015/05/21 职场文书
惊天动地观后感
2015/06/10 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书