chzhiyi / -KnowledgeShare

6 stars 1 forks source link

20190620 - Locust压测工具的介绍和实际应用 - bailian #88

Open 15175036183 opened 5 years ago

15175036183 commented 5 years ago

locust的介绍和实际应用

jmeter和locust的区别

参考网址:https://www.missshi.cn/api/view/blog/5b1cafde4321ec240f000000

共同点:1.都是开源的分布式压力测试工具

​ 2.都有表格、图形、等可视化数据报告的输出

不同点:1.jmeter的开发语言是Java,locust的开发语言是python

​ 2.接口的拼接,jmeter是通过添加组件的方式来实现的;locust是通过编写python脚本来实现的

​ 3.jmeter界面化操作比较强,支持的是低并发量的测试,并发机制为线程;locust支持高并发量,比较小 巧,并发机制为协程

​ 4.复杂化场景测试时,jmeter通过录制脚本方式来实现,locust通过脚本编写方式来实现

所以说,在高并发量和复杂化场景的压力测试情况下优先选择locust。

Locust安装步骤:

1.安装python

2.命令安装 pip install locust,出现报错:

File "D:\Program Files\python\lib\site-packages\pip\_vendor\urllib3\response.p
y", line 336, in _error_catcher
    raise ReadTimeoutError(self._pool, None, 'Read timed out.')
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files
.pythonhosted.org', port=443): Read timed out.
You are using pip version 18.1, however version 19.1.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' comm
and

解决方案:去D:\Program Files\python\Lib\site-packages目录下把pip-18.0.1.dist-info删除,再次运行python -m pip install --upgrade pip 后升级成功。

再次执行命令pip install locust 报pip连接超时:

pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

解决方案网址:https://blog.csdn.net/qq_39161804/article/details/81191977

最终使用命令 pip --default-timeout=1000 install locust 设置了pip下载超时时间为1000秒,最后安装成功。

使用locust -help验证是否安装成功。

测试脚本编写
参考网址:https://www.cnblogs.com/imyalost/p/9758189.html

https://blog.csdn.net/weixin_33682719/article/details/86016544

1.新建一个TaskSet类,该类下面写需要请求的接口以及相关信息

2.@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;

3.WebsiteUser()类用于设置生成负载的基本属性:

​ task_set:指向定义了用户行为的类,也就是tmallSubmitOrder()类

​ min_wait:模拟负载的任务之间执行时的最小等待时间,单位为毫秒

​ max_wait:模拟负载的任务之间执行时的最大等待时间,单位为毫秒

​ host:请求的主机名

具体实例:

from locust import HttpLocust, TaskSet, task
import queue
class SubmitOrder(TaskSet):
    # 提交订单
    @task(1)
    def submit_order(self):
        # 定义请求地址url
        url = "/SubmitOrder"
        # 定义请求信息头
        header = {"Content-Type": "application/json"}
        try:  #获取队列中的数据
            data = self.locust.param_queue.get()
        except queue.Empty:    # 队列取空后,直接退出
            print("no data exist")
            exit(0)
        # 添加请求参数
        params = {"orderId":data,"Num":"1","Price":"100","mobile":"11000000000"}
        print(params)
        req = self.client.post(url, params, headers=header, verify=False)
        if req.status_code == 200:
            print("success")
        else:
            print("fails")

class websitUser(HttpLocust):
    task_set = SubmitOrder  #定义了要执行的用户行为的类
    min_wait = 2000  # 每次请求间隔最小时间,单位为毫秒
    max_wait = 5000  # 每次请求间隔最大时间,单位为毫秒
    host = "http://baidu.com"
    # 读取参数文件里的数据,并添加到队列中
    param_queue = queue.Queue()   #定义一个队列
    # for i in range(210030, 215000):
    with open('orderid.csv', 'r') as f:
        for i in f:
            param_queue.put(i)

if __name__ == "__main__":
    import os
    os.system("locust -f locustre.py --no-web --csv=result -c 10 -r 2 -t 10s")
启动locust服务

在cmd窗口输入命令 locust -f load_test.py

解释:-f 指定文件名称 --host 指定host路径,此处的链接与上面脚本中的“/”进行拼接

D:\Users\hlj>locust -f load_test.py  --host=https://www.baidu.com/
[2019-06-13 13:49:24,583] hlj-pc-PC/INFO/locust.main: Starting web monitor at *:
8089
[2019-06-13 13:49:24,615] hlj-pc-PC/INFO/locust.main: Starting Locust 0.11.0
[2019-06-13 13:53:06,179] hlj-pc-PC/INFO/locust.runners: Hatching and swarming 1
0 clients at the rate 2 clients/s...
[2019-06-13 13:53:11,184] hlj-pc-PC/INFO/locust.runners: All locusts hatched: We
bsiteUser: 10

解释:1、第一行显示locust启动并部署在localhost:8089的域名中,且占用了本地8089的端口号

​ 2、第二行显示当前所启动的locust版本信息

在浏览器中输入localhost:8089,进入flask库生成的web页面,查看压测过程的数据

locust压测的界面结果

测试结果说明:

Type:请求类型,即接口的请求方法;

Name:请求路径;

requests:当前已完成的请求数量;

fails:当前失败的数量;

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

Average:平均响应时间,单位为毫秒;

Min:最小响应时间,单位为毫秒;

Max:最大响应时间,单位为毫秒;

Content Size:所有请求的数据量,单位为字节;

reqs/sec:每秒钟处理请求的数量,即QPS;
还可以通过命令行的方式去运行
locust -f  test.py  --no-web --csv=result --no-web -c 10 -r 2 -t 300s

启动参数:

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

--csv表示运行结果文件名的前缀

-c 设置虚拟用户数,在no-web前提下使用

-r 设置每秒启动虚拟用户数,在no-web前提下使用

-t 设置设置运行时间.(s/m/h),在no-web前提下使用

n:设置请求总个数,在no-web前提下使用

运行完后会在当前目录下生成两个压测结果

1.result_requests.csv 聚合报告,记录了请求书、响应时间、QPS、响应文本大小等

2.result_distribution.csv 分布式响应时间结果