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 30 Python
python中使用序列的方法
Aug 03 Python
Python max内置函数详细介绍
Nov 17 Python
详解python3中tkinter知识点
Jun 21 Python
python 实现A*算法的示例代码
Aug 13 Python
将Python字符串生成PDF的实例代码详解
May 17 Python
Python中Numpy mat的使用详解
May 24 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
Pytorch 实现focal_loss 多类别和二分类示例
Jan 14 Python
在pycharm中创建django项目的示例代码
May 28 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
python wsgiref源码解析
Feb 06 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
提问的智慧(2)
2006/10/09 PHP
php木马webshell扫描器代码
2012/01/25 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
JS location几个方法小姐
2008/07/09 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
Python中将字典转换为列表的方法
2016/09/21 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
Python数据结构之图的应用示例
2018/05/11 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
计算机专业个人简短的自我评价
2013/10/23 职场文书
老师自我鉴定范文
2013/12/25 职场文书
个人求职信范文分享
2014/01/06 职场文书
决心书范文
2014/03/11 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
个人政治思想总结
2015/03/05 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS