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


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

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

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

    ...

    来源  :  虫师   https://www.cnblogs.com/fnng/

  • 相关阅读:
    [转]Eclipse之ANT使用
    [转]深入浅出解读微软云计算:让云触手可及
    [转]android的selector,背景选择器
    [转]android 个人铃声设置代码
    [转]Android中的Frame动画
    [转]WebGL中文教程
    节点遍历函数
    javascript深拷贝
    javascript 跨浏览器的事件系统
    CSS选择器的权重详解
  • 原文地址:https://www.cnblogs.com/rxxbb123/p/14231754.html
Copyright © 2020-2023  润新知