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代码来解图片迷宫的方法整理
Apr 02 Python
Python中对象迭代与反迭代的技巧总结
Sep 17 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
Python Excel处理库openpyxl使用详解
May 09 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
python中树与树的表示知识点总结
Sep 14 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
使用pandas库对csv文件进行筛选保存
May 25 Python
简述python&pytorch 随机种子的实现
Oct 07 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 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
德生PL550的电路分析
2021/03/02 无线电
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
PHP 快速排序算法详解
2014/11/10 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
python重试装饰器示例
2014/02/11 Python
Python素数检测的方法
2015/05/11 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python抖音表白程序源代码
2019/04/07 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
python实现mean-shift聚类算法
2020/06/10 Python
运行Python编写的程序方法实例
2020/10/21 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
疾病捐款倡议书
2014/05/13 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
婚庆公司开业主持词
2015/06/30 职场文书