首页 > 其他分享 >自己上手写性能测试工具(一)

自己上手写性能测试工具(一)

时间:2023-11-03 10:36:00浏览次数:45  
标签:请求 url 性能 number print .........................................................

国庆重新学习了一下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)和参数。

更多统计维度,吞吐量、吞吐率

增加启动时间,思考时间等

...

标签:请求,url,性能,number,print,.........................................................
From: https://blog.51cto.com/fnngj/8162037

相关文章

  • 自己上手写性能测试工具(二)
    上周教大家如何通过Python实现性能测试工具,最后留了一下问题,今天我们继续来实现命令行工具。依赖库requests==2.22.0gevent==20.9.0numpy==1.19.2click==7.1.2click库今天的主角是click库。中文文档:https://www.osgeo.cn/click/index.html第一个例子(hello.py):importclick@c......
  • 微软自动化测试工具palywright
    前言我们介绍许多e2e的自动化测试工具一类是基于Selenium的测试框架:robotframeworkgaugeSeleniumBaseseldom(我自己维护的)另一类是基于JS语言的测试工具:cypresspuppeteer前都本身就是基于Selenium的自动化测试工具,后者在测试人员这个圈子也是未能撼动Selenium的地位,我认为有两个......
  • 打造性能监控平台
    在做性能测试的时候,你是如何监控被测试系统的硬件资源的,如果是云平台,那么一般提供的有可视化的监控信息,如果是本地服务,只能通过系统命令(如ps、top、lsof等)查看。我们可以自己打造一个可视化的系统系统资源监控平台,本文就教大家如何实现。准备工具:Flask:一个简单的web框架。psutil:......
  • 自己上手写性能工具(三)
    自己上手写性能测试工具(一)自己上手写性能测试工具(二)我又来更新第三篇了,因为我又改进了一些功能。显示性能测试进度前些天逛github发现了tqdm,他可以动态显示程序的执行进度。根据前面开发的功能,在运行性能时,如果并发用户和请求数很大,那么终端就处于执行状态,不会有任何信息输出,直到运......
  • Prometheus+Grafana实现服务性能监控:windows主机监控、Spring Boot监控、Spring Cloud
    1、Prometheus介绍Prometheus使用Go语言开发,中文名称叫:普罗米修斯。Prometheus是一个开源系统最初在SoundCloud构建的监控和警报工具包。自2012年成立以来,许多公司和组织已经采用了Prometheus,它现在是一个独立的开源项目并独立于任何公司进行维护。Prometheus于2016年加入云......
  • sql语句性能进阶必须了解的知识点——索引失效分析
    在前面的文章中讲解了sql语句的优化策略https://blog.51cto.com/liwen629/8146651sql语句的优化重点还有一处,那就是——索引!好多sql语句慢的本质原因就是设置的索引失效或者根本没有建立索引!今天我们就来总结一下那些无效的索引设置方式进而避免大家踩坑!看到这里有的同学会问:what?......
  • vue3项目 - 手写可拖拽带进度监控的文件上传组件
    1.实现原理: 原生的上传文件组件: <inputref="uploadFileRef"style="display:none"type="file"/> 自定义上传区域:  拖拽事件添加(dragover,dragenter,drop),点击事件添加(click)调用原生上传组件的click事件:uploadFileRef.value.click()监听元素上传组件的值回传事件:c......
  • NativeBuffering,一种高性能、零内存分配的序列化解决方案[性能测试篇]
    第一版的NativeBuffering([上篇]、[下篇])发布之后,我又对它作了多轮迭代,对性能作了较大的优化。比如确保所有类型的数据都是内存对齐的,内部采用了池化机器确保真正的“零内存分配”等。对于字典类型的数据成员,原来只是“表现得像个字段”,这次真正使用一段连续的内存构架了一个“哈希......
  • 高性能渲染——详解Html Canvas的优势与性能
    本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。一、什么是Canvas想必学习前端的同学们对Canvas都不陌生,它是HTML5新增的“画布”元素,可以使用JavaScript来绘制图形。Canvas元素是在HTML5中新增......
  • gin框架curd 和java springboot crud 的比较及性能
    Gin框架与SpringBoot框架的CURD比较Ginvs.SpringBoot:简介Gin(Go语言):Gin是用于构建Web应用程序和API的轻量级、高性能框架,使用Go编程语言。它以简洁和高性能而闻名。SpringBoot(Java):SpringBoot是一个用于构建基于Java的Web应用程序的开源Java框架。它简化了使......