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内置函数之filter map reduce介绍
Nov 30 Python
Python可跨平台实现获取按键的方法
Mar 05 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
python实现推箱子游戏
Mar 25 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
Python远程视频监控程序的实例代码
May 05 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
简单了解python协程的相关知识
Aug 31 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
想学画画?python满足你!
Dec 24 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
PHP积分兑换接口实例
2015/02/09 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
python中的装饰器详解
2015/04/13 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
VC++笔试题
2014/10/13 面试题
厨房工作人员岗位职责
2013/11/15 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
介绍信范文
2015/01/31 职场文书
放假通知范文
2015/04/14 职场文书
Django如何与Ajax交互
2021/04/29 Python
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS