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 相关文章推荐
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
Python实现字典按照value进行排序的方法分析
Dec 23 Python
Python 删除连续出现的指定字符的实例
Jun 29 Python
TensorFlow实现模型评估
Sep 07 Python
python读取文本中的坐标方法
Oct 14 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
关于numpy数组轴的使用详解
Dec 05 Python
python如何输出反斜杠
Jun 18 Python
python+requests实现接口测试的完整步骤
Oct 27 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
Pycharm 解决自动格式化冲突的设置操作
Jan 15 Python
python中如何对多变量连续赋值
Jun 03 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中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
jquery密码强度校验
2015/12/02 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
js+css实现打字效果
2020/06/24 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
Python学习笔记之常用函数及说明
2014/05/23 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
Servlet方面面试题
2016/09/28 面试题
制药工程专业应届生求职信
2013/09/24 职场文书
档案管理员岗位职责
2013/12/01 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
党员违纪检讨书
2014/02/18 职场文书
大学信息公开实施方案
2014/03/09 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书