前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >locust入门实操,简单上手压测

locust入门实操,简单上手压测

作者头像
怪盗LYL
发布2022-06-13 12:12:01
8140
发布2022-06-13 12:12:01
举报
文章被收录于专栏:测试开发真货

一:安装

使用 pip 安装 Locust:

代码语言:javascript
复制
pip install locust

shift+右键可以进入PowerShell 命令行窗口,也可以进入cmd窗口,和pycharm命令窗口输入安装命令。

locust需要一个py文件描述压测内容和操作。

locust版本1.0之前:文件内容大致如下:

需要一个用户类,该类继承HttpLocust。

代码语言:javascript
复制
class UserOne(HttpLocust):
    task_set = UserTask #指向定义了用户行为的类
    weight = 1 #同时运行多个Locust类时会用到,用于控制不同类型任务的执行权重,测试开始后,每个虚拟用户(Locust实例)的运行逻辑都会遵循如下规律:先执行WebsiteTasks中的on_start(只执行一次),作为初始化;从WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)一个任务执行;根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;重复2~3步骤,直至测试任务终止。
    min_wait = 1000 #最小等待时间毫秒
    max_wait = 1000 #最大等待时间毫秒
    #相同可控制每秒增长量
    stop_timeout = 5 Locust停止的秒数,如果为None,将不停止一直执行任务,单位为s秒
    host = "https://www.baidu.com" #压测地址根路径

一个用户描述类:

代码语言:javascript
复制
class UserTask(TaskSet):
    @task #@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;
    def tc_index(self): 
        self.client.get("/")

locust版本1.0以后:文件内容大致如下:

可以看到从HttpLocust类变成了HttpUser类。

我们创建一个py文件取个喜欢的名字,并写出来大概的代码。

代码语言:javascript
复制
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
    @task #@task 装饰的方法才会在 Locust 虚拟用户运行过程中被调用
    def testdef(self):
        pass
class Userone(HttpUser):
    wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
    # wait_time = constant(3)  # 每次请求停顿时间 (思考时间)
    host = 'http://xxxx'
    # tasks = {
    #     MyTest: 3 #后面数字表示多个行为时候选择比例
    #     MyTest: 1 #后面数字表示多个行为时候选择比例
    # }
    tasks = [MyTest]

这里教大家一个从postman导出Python脚本的方法,如下图。

代码语言:javascript
复制
import requests

url = "http://www.weather.com.cn/data/cityinfo/101190408.html"

payload={}
headers = {}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

现在修改我们的locust代码,注意要使用locust的client客户端。

代码语言:javascript
复制
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
    @task
    def testdef(self):
        url='data/cityinfo/101190408.html' #调用接口 将会拼在根路径后面
        payload = {}
        headers = {}
        r=self.client.request(method='GET', url=url,  headers=headers, name='获取天气') #注意要使用locust的client客户端
        r.encoding = 'UTF-8' #解码
        print(r.text)
    def on_start(self):
        print('这是SETUP,每次实例化User前都会执行!')
    def on_stop(self):
        print('这是TEARDOWN,每次销毁User实例时都会执行!')
class Userone(HttpUser):
    wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
    host = 'http://www.weather.com.cn/'
    # tasks = {
    #     MyTest: 3 #后面数字表示多个行为时候选择比例
    #     MyTest: 1 #后面数字表示多个行为时候选择比例
    # }
    tasks = [MyTest]
if __name__ == "__main__":
    import os
    os.system("locust -f 演示locust.py") #相当于我们在当前目录命令行下执行了locust -f 演示locust.py

实际使用当中我们会自己添加自己的断言,注意catch_response 属性,必须设置为TRUE才能设置断言错误。

代码语言:javascript
复制
import json
import random
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
    @task
    def testdef(self):
        url='data/cityinfo/101190408.html'
        payload = {}
        headers = {}
        f = [200, 100]
        x=random.choice(f)
        print(x)
        with self.client.request(method='GET', url=url,  headers=headers, name='获取天气',catch_response=True) as response:  #catch_response = True :布尔类型,如果设置为 True, 允许该请求被标记为失败。
            if response.status_code != x:
                response.failure("请求错误,返回状态不正确")
            elif response.elapsed.total_seconds() > 0.02:
                response.failure("请求错误,耗时太长")
            else:
                response.success()
        response.encoding = 'UTF-8'
        print(response.text)
    def on_start(self):
        print('这是SETUP,每次实例化User前都会执行!')
    def on_stop(self):
        print('这是TEARDOWN,每次销毁User实例时都会执行!')
class Userone(HttpUser):
    wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
    host = 'http://www.weather.com.cn/'
    # tasks = {
    #     MyTest: 3 #后面数字表示多个行为时候选择比例
    #     MyTest: 1 #后面数字表示多个行为时候选择比例
    # }
    tasks = [MyTest]
if __name__ == "__main__":
    import os
    os.system("locust -f 演示locust.py")#相当于我们在当前目录命令行下执行了locust -f 演示locust.py

浏览器访问:运行命令locust -f 演示locust.py启动服务,可以看到默认端口8089,通过浏览器http://localhost:8089/访问,0.0.0.0运行以后我们的同事可以通过局域网我们的ip访问我们的服务,以后介绍django搭建平台时候也会用的。

增长折线图

运行的异常信息,可以看到类型里面描述是我们自己设置的错误原因。
下载运行结果

无浏览器模式:-u指定要产生的用户数,并-r指定产生速率(每秒要启动的用户数)

代码语言:javascript
复制
locust -f 演示locust.py --headless -u 100 -r 10

--run-time

如果要指定测试的运行时间,则可以使用--run-time或进行操作-t ,一旦时间到,locust就停止运行,1h30m5s,h小时m分钟s秒。

代码语言:javascript
复制
locust -f 演示locust.py --headless -u 100 -r 10 --run-time 5s

默认情况下,locust将立即停止任务(甚至不等待请求完成)。如果要允许任务完成其迭代,则可以使用--stop-timeout <seconds>参数

代码语言:javascript
复制
locust -f --headless -u 1000 -r 100 --run-time 1h30m --stop-timeout 10
代码语言:javascript
复制
locust -f 演示locust.py --headless -u 100 -r 10 --run-time 5s  --csv=mycsv
加上--csv=mycsv 参数保存CSV文件

简单的介绍了下locust入门,优点是快速上手,单机模拟出较高的并发压力,缺点是报告简单,性能上不去。读者可以深入了解下locust分布式,祝大家情人节快乐,有情人终成眷属,没对象的好好学习。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发真货 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行的异常信息,可以看到类型里面描述是我们自己设置的错误原因。
  • 下载运行结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档