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中的atexit模块
Mar 07 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
对pandas进行数据预处理的实例讲解
Apr 20 Python
Win8下python3.5.1安装教程
Jul 29 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
Python----数据预处理代码实例
Mar 20 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Python实现UDP程序通信过程图解
May 15 Python
浅析Python中的套接字编程
Jun 22 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
SONY SRF-40W电路分析
2021/03/02 无线电
php 变量未定义等错误的解决方法
2011/01/12 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
python登录QQ邮箱发信的实现代码
2013/02/10 Python
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python中作用域的深入讲解
2018/12/10 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
会计职业生涯规划范文
2014/01/04 职场文书
讲座主持词
2014/03/20 职场文书
农村改厕实施方案
2014/03/22 职场文书
医学生求职信
2014/07/01 职场文书
党员目标管理责任书
2014/07/25 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
亲戚关系证明
2015/06/24 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
Nginx速查手册及常见问题
2022/04/07 Servers