禁止套娃?看大神用工具自己写性能测试工具

发表于:2020-12-03 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:虫师    来源:博客园

  国庆重新学习了一下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)和参数。
  更多统计维度,吞吐量、吞吐率
  增加启动时间,思考时间等。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号