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 正则式 概述及常用字符
May 07 Python
python list转dict示例分享
Jan 28 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
Pythony运维入门之Socket网络编程详解
Apr 15 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python实现LRU热点缓存及原理
Oct 29 Python
python写一个随机点名软件的实例
Nov 28 Python
Python实现的北京积分落户数据分析示例
Mar 27 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
matplotlib绘制正余弦曲线图的实现
Feb 22 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
跟我学Laravel之路由
2014/10/15 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
python各层级目录下import方法代码实例
2020/01/20 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
实习护理工作自我评价
2013/09/25 职场文书
自荐信的五个重要部分
2013/10/29 职场文书
关于期中考试的反思
2014/02/02 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
服务员岗位职责
2015/02/03 职场文书
个性与发展自我评价
2015/03/06 职场文书
签字仪式主持词
2015/07/03 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书