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学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
Python获取网页上图片下载地址的方法
Mar 11 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
Python进阶篇之字典操作总结
Nov 16 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
解析python实现Lasso回归
Sep 11 Python
Python接口测试结果集实现封装比较
May 01 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
python中的对数log函数表示及用法
Dec 09 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python中添加模块导入路径的方法
Feb 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程序?
2006/12/08 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
提取字符串中年月日的函数代码
2013/11/05 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
给校长的建议书300字
2014/05/16 职场文书
大班亲子运动会方案
2014/06/10 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
学校证明范文
2015/06/24 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫