zoukankan      html  css  js  c++  java
  • python性能测试工具locust

     

    1.概述:

    1.我们对目前比较流行的几款压测工具进行了调研。Jmeter与LoadRunner基于多线程实现并发,多线程由操作系统决定,由于上下文切换频繁、内核调度频繁,单台机器很难产生大量线程并发。以多线程方式运行会有很多线程切换的开销,故而考虑多协程方式实现,

    Jmeter由Java语言编写,并不支持协程机制。Python语言通过async/await的方式实现协程,而Locust正是基于python。

     2..Locust 完全是基于事件的,因此在一台机器上支持数千个并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调。相反它通过 gevent 使用轻量级协程。这允许您用 Python 编写非常有表现力的场景,而不用回调使代码复杂化。

    2.压测工具对比:

    当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?locust?还是loadrunner呢?

     备注:服务端数据可以通过nmon_analyser或者Grafana监控

    3.优缺点说明:

     3.1jmeter采用线程并发机制,但其主要依靠增加线程数提高并发量,当单机模拟数以千计的并发用户时,对于CPU和内存的消耗比较大,jmeter本身具有以下优点和缺点:

     优点:①界面可视化操作,可以使用录制脚本方式对较为复杂的用户流建模,还可以创建断言来验证测试行为是否通过;

        ②表格、图形、结果树等多类可视化数据分析和报告输出;

        ③支持http、ftp、tcp等多种协议类型测试;

        ④支持分布式压力测试,但对于上万的用户并发测试需要多台测试机支持,资源要求比较大;

        ⑤可以用于测试固定吞吐量下的系统性能,例如在100QPS(QPS:每秒查询率)下系统的响应时间和资源消耗;

    缺点:①jmeter的GUI模式消耗资源较大,当需要测试高负载时,需要先使用GUI工具来生成XML测试计划,然后在非GUI模式下导入测试计划运行测试,并且关闭不需要的侦听器(收集数据与展示测量的组件),因为侦听器也会消耗掉本用于生成负载的大量资源。测试结束后后,需要将原始结果数据导入GUI以才能查看结果。

    3.2.locust是一个的简单易用的分布式负载测试工具,主要用来对网站进行负载压力测试。locust使用python语言开发,测试资源消耗远远小于java语言开发的jmeter。且其支持分布式部署测试,能够轻松模拟百万级用户并发测试。

    优点:①locust借助于协程实现对用户的模拟,相同物理资源(机器cpu、内存等)单台负载机可模拟的负载数远超jmeter

        ②相比jmeter需要界面点击录制复杂场景的麻烦,locust只需用户使用python编写用户场景完成测试;

        ③不同与jmeter复杂的用户使用界面,locust的界面干净整洁,可以实时显示测试的相关细节(如发送请求数、失败数和当前发送请求速度等);

        ④locust虽然是面向web应用测试的,但是它可以用来测试几乎所有系统。给locust编写一个客户端,可以满足你所有的测试要求;

    缺点同wrk一样,locust测试结果输出不如jmeter的测试结果展示类型多;

    4.Locust的指标体系:

    (1)响应时间
    反应系统处理效率指标,从开始到完成某项工作所需要时间的度量,响应时间通常随着负载的增加而增加;
    (2)吞吐率(QPS)

     表示“每秒查询数”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内的处理流量。
        备注:QPS 每秒钟发送的请求的数量。(一个事务可能包含多个请求)

    (3)事务处理能力(TPS在locust中为RPS)

    表示服务器每秒处理的事物数,它是衡量系统处理能力的重要指标 (每秒处理请求数)
     
    备注:
      性能测试评判点_性能指标:
    TPS,响应时间(平均响应时间,完成90%请求响应时间),错误/成功率
     
     

     ##___________________________Locust环境搭建_________________________________________________________________________

     1.安装locust:

    pip3 install locust

    检查是否安装成功,执行命令:locust --v

    2.脚本实例:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from locust import HttpUser, TaskSet, task
    # 定义用户行为类
    class UserBehavior(TaskSet):
        @task  # 任务项
        def test_login(self):
            header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
            url = '/login.htm'
            res = self.client.get(url,headers=header, verify=False)
            #断言方式一
            #assert res.status_code == 200
            #断言方式二
            if res.status_code == 200:
                print('登陆成功!')
            else:
                print('登陆失败!')
    
    class WebSiteUser(HttpUser):
        tasks = [UserBehavior]
        #host = "https://www.cnblogs.com"
        max_wait = 5000
        min_wait = 1000
    
    
    
    if __name__ == "__main__":
        import os
        os.system("locust -f test.py --host=https://www.cnblogs.com")#这样写可以直接运行文件,也可以命令调用文件

    多个接口测试脚本

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from locust import  HttpUser,TaskSet,task
    
    class UserBehavior(TaskSet):
        @task
        def chen_users(self):
            headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##设置请求Headers头部
            #请求输入参数
            p = {"game_id":"20210708110"}
            url='/subcontract'
            res=self.client.post(url=url,headers=headers,params=p)
            if res.status_code == 200:
                print('登陆成功!')
            else:
                print('登陆失败!')
    
        @task(1)
        def test_groups(self):
            headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##设置请求Headers头部
            res=self.client.get("/getcontract", headers= headers)
            if res.status_code == 200:
                print('test登陆成功!')
            else:
                print('test登陆失败!')
    
    
    class WebsiteUser(HttpUser):
        tasks = [UserBehavior]
        min_wait = 3000
        max_wait = 6000
    
    
    
    if __name__ == "__main__":
        import os
        os.system("locust -f test.py --host=http://106.55.29.87:8000")
    View Code

    UserBehavior 类继承TaskSet 类,用于描述用户行为。

    • @task约定该方法为一个事件,一部分的数字表示请求比例,上面的比例为2:1 默认1:1

    • test_users()方法表示一个用户行为,这里是请求user接口。

    • test_groups()方法表示请求group接口。

    • client.get()用于指定请求的路径。

    网站用户类用于设置性能测试。

    • task_set:一个定义的用户行为类。

    • min_wait:执行事务之间用户等待时间的下界(单位:毫秒)。

    • max_wait:执行事务之间用户等待时间的上界(单位:毫秒)。

    3.执行测试:

       web模式:

    使用命令行启动测试: locust -f test.py --host=https://www.cnblogs.com .................................................... .......普通启动
    locust -f  E: estdalan_sparrowsparrow est.py --host=https://www.cnblogs.com --web-port 8091 ...............启动时指定端口
    如果要运行分布式Locust,必须在启动从机时指定主机(运行分布在单台机器上的Locust时不需要这样做,因为主机默认为127.0.0.1):
    locust -f testscript/locusttest.py --slave --master-host=192.168.0.100 --host=https://cnblogs.com
    如果要运行分布在多个进程中的Locust,通过指定-master以下内容来启动主进程 :
    locust -f testscript/locusttest.py --master --host=https://www.cnblogs.com

    no web 模式:
    1. locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
    2. locust -f  D:PycharmProjectsUItestlocust_scriptslocust_test2.py --no-web -c 1 -r 1 -t 10s --csv=d:

               启动参数:

                  --no-web 表示不使用Web界面运行测试。

                 -c 设置虚拟用户数。

                 -r 设置每秒启动虚拟用户数。

                 -t 设置设置运行时间。

                 --csv运行结果保存目录

    备注:

    1.Locust no-web模式执行命令提示locust: error: unrecognized arguments: -no-web -c 的问题

    解决:将命令参数--no-web 更改为 --headless,将命令中指定用户并发数的参数 -c 改为 -u即可。

         

    执行测试后在浏览器打开localhost:8089可以看到如下页面:

    • Number of users to simulate:设置模拟用户数。

    • Hatch rate(users spawned/second):每秒产生(启动)的虚拟用户数。

    • 单击“Start swarming”按钮,开始运行性能测试

     

    运行之后可以看到主界面如下:

    性能测试参数如下。

    • Type:请求的类型,例如GET/POST。

    • Name:请求的路径。

    • request:当前请求的数量。

    • fails:当前请求失败的数量。

    • Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;

    • Average:平均值,单位毫秒,所有请求的平均响应时间。

    • Min:请求的最小服务器响应时间,单位毫秒。

    • Max:请求的最大服务器响应时间,单位毫秒。

    • Content Size:单个请求的大小,单位字节。

    • reqs/sec:每秒钟请求的个数。即QPS

     

     点击 Charts 菜单可以查看性能图表

    图表含义如下:

    • Total Request per Second :每秒的请求数

    • Average Response Time: 平均响应时间

    • Number of Users: 用户数



    
    
    

    相关连接:

    https://blog.csdn.net/weixin_38320674/article/details/108505688 ....................QPS、TPS、并发用户数、吞吐量关系

    https://zhuanlan.zhihu.com/p/282824807  ........................locust代码案例

    https://www.cnblogs.com/shenh/p/12424990.html ....................locust环境流程(包含分布式)

    https://www.cnblogs.com/imyalost/p/9758189.html ......................locust基本环境流程

    https://www.cnblogs.com/yoyoketang/p/9642242.html .................先登录场景案例

    https://testerhome.com/topics/12712 .............................................Locust 简单例子

    https://mp.weixin.qq.com/s?__biz=MzAxNjg3MTU4OQ==&mid=2247484282&idx=1&sn=f529a433410dde29ffb86efd792956aa ................locust汇总(包含no web模式)

    https://testerhome.com/topics/24873 .......................................重新定义 Locust 的测试报告_性能监控平台

      

  • 相关阅读:
    #QCon#北京2011大会“更有效地做测试”专题Slides资料
    长草了,冒个泡
    很好的一个书单
    团购——以价格换体验
    rpm deb命令集合[转]
    一个自动copy文件到指定目录的小程序
    ubuntulinux下的精品软件大汇总
    解决星际译王不朗读单词问题
    数据结构实验三:二叉树及其应用
    数据结构实验六:内部排序技术
  • 原文地址:https://www.cnblogs.com/chen-xia/p/15089593.html
Copyright © 2011-2022 走看看