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 24 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python语言的变量认识及操作方法
Feb 11 Python
python使用rpc框架gRPC的方法
Aug 24 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
Python常用模块之requests模块用法分析
May 15 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 Python
python实现简单聊天功能
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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
PHP初学者头疼问题总结
2006/10/09 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
Jquery 自定义动画概述及示例
2013/03/29 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
安装dbus-python的简要教程
2015/05/05 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
vscode 远程调试python的方法
2017/12/01 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
大专生简历的自我评价
2013/11/26 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
团干部培训方案
2014/06/03 职场文书
暑期教师培训方案
2014/06/07 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
邀请函样本
2015/02/02 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
小学家长意见怎么写
2015/06/03 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android