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的Flask框架中实现分页功能的教程
Apr 20 Python
python通过加号运算符操作列表的方法
Jul 28 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
使用tensorflow实现线性回归
Sep 08 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
python中selenium库的基本使用详解
Jul 31 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
用Python可视化新冠疫情数据
Jan 18 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
ext 代码生成器
2009/08/07 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
python放大图片和画方格实现算法
2018/03/30 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
服装设计专业毕业生推荐信
2013/11/09 职场文书
经理秘书岗位职责
2013/11/14 职场文书
室内设计专业自荐信
2014/05/31 职场文书
大学班长竞选稿
2015/11/20 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS