Locust性能测试

文章目录

  • python、Locust性能测试
    • Locust是什么?
    • Locust特点
    • Locust安装
    • Locust性能测试脚本
      • 任务集TaskSet类
      • 首页接口
      • 用户类HttpLocust
      • 运行性能测试脚本
      • 登录接口
      • 参数化
        • 数据放在程序list数组内
          • 步骤:
        • 数据放在文件内
          • 步骤:
      • 参数的上下关联
        • 步骤:
    • 分布式压测
      • 分布式压测的原理:
        • 在同一台电脑上运行多个slave:
        • 在不同的电脑上运行多个slave

python、Locust性能测试

Locust是什么?

Locust翻译成中文就是蝗虫的意思,就像蝗虫一样对系统发起成千上万的请求。以测试系统能否在高并发下正常运行 ,它是一款python的第三方开源的性能测试库,。完全基于poython开发,并采用了基于事件的处理机制。具有明显的特点

Locust特点

简单易学,可以快速开发性能测试脚本

开源免费

分布式执行,在多台机器上对系统发起持续请求

基于事件驱动 与其他常用工具不同的是 Locust采用的是协程的方式 可以达到更高数量级的并发

不支持监控 需要配合其它监控工具

Locust安装

Locust是python的第三方库 所以可以用pip下载

>>>pip install Locust

安装完成后 可以先压测一个接口 感受 一下

Locust性能测试脚本

这个脚本大致分为两个模块

  • ​ 任务集 需要继承TaskSet(就是把压测的接口,按照业务顺序编写)
  • ​ 用户类继承HttpLocust(配置用户请求相当于jmeter的线程组配置)

任务集TaskSet类

首页接口

首先 编写第一个继承自TaskSet类 先压测一个首页的接口

导入所需模块 由于headers每个接口都会用所以先定义成全局变量

TestIndex继承自TaskSet类 这个类里的方法就是要压测的接口了

getinex首页请求方法 client和requests的用法一样

​ 三个参数分别是: 请求接口的路径 headers name参数是说明一下这个是什么接口

@task采用可选的weight参数,该参数可用于指定任务的执行率 如果一个任务是2 另一个4 那么4的执行量是2的两倍

#导入locust相关模块
from locust import HttpLocust,TaskSet,task

#定义一个任务类 继承TaskSet
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
class TestIndex(TaskSet):
    @task(2)
    def getindex(self):
         #client是Taskset类的方法 其实就相当于requests请求
         # @task加一个注解 声明是一个任务
        res= self.client.post("/index/info",headers=headers,name="打开首页")

然后TaskSet就算写完了 接下来就是用户类

用户类HttpLocust

  • ​ host:是请求url的域名

  • ​ Task_set:指向当前的用户类要执行那个任务

  • ​ between 指定等待时间 参数 :

  • ​ min_wait :最小等待时间

  • ​ max_wait:最大等待时间

class WebSite(HttpLocust):
    """该类 用于配置用户请求"""
    host = "http://127.0.0.1:5000"
    task_set = TestIndex
    wait_time = between(1,2)

运行性能测试脚本

一个简单的首页接口压测就算写完了 来运行一下看看效果

DOS窗口 进入py文件所在目录 输入 如下命令开启服务

locust -f TestIndex.py --web-host="127.0.0.1"

开启成功后 在浏览器输入 127.0.0.1:8089 打开Locust的web服务页 在该页面进行一些配置

第一个输入框是配置一共生成多少个用户总数

第二个输入框配置每秒钟生成几个用户数

Locust性能测试_第1张图片
配置好以后 点击开始测试 这就完成了 真对首页的接口压测的脚本的开发

接下来再写一下登录接口的压测脚本

登录接口

  • 会做接口测试或者接口自动化测试再开发这种测试脚本就会很轻松 因为思路都是类似的 登录接口就比首页多了一个请求参数 其他都是一样的
    @task(2)
    def test_login(self):
        data =  {"phone":1234567898,"password":123456 }
        self.client.post("/login/login",headers=hraders,data=data,name="登录")

class WebSite(HttpLocust):
    """该类 用于配置用户请求"""
    host = "http://127.0.0.1:5000"
    task_set = TestIndex
    wait_time = between(1,2)

开启服务和首页操作时的一样

参数化

以登录接口为 使用参数化登录不同的账户 举两个账户登录的参数化吧

首先 可以把准备要做参数化的数据放在程序里 放在list数组

也可以分离在文件里 然后再读出来

数据放在程序list数组内

登录的password可以一样所以在测试的时候为了方便都设置成123456 只有账号不能重复 所以只需要参数化帐号就行了

步骤:
  • ​ 将准备好的帐号放在用户类WebSite内, userdata数组
  • ​ 然后在任务类登录方法里 self.locust.userdata 指向用户类的userndata将值随机取出来
  • ​ 然后把随机取出的值进行参数的拼接
    @task(2)
    def test_login(self):
        #取出WebSite用户类中的uiserdata 调用choice进行随机取值
                               #locust指向的就是用户类 WebSite
        userinfo = choice(self.locust.userdata)
        data =  {"phone":userinfo,"password":123456 }
        res = self.client.post("/login/login",headers=hraders,data=data,name="登录")
        assert res.status_code == 200

class WebSite(HttpLocust):
    """该类 用于配置用户请求"""
    host = "http://127.0.0.1:5000"
    task_set = TestIndex
    wait_time = between(1,2)
    userdata = [12345678987,13242432452]

然后执行

数据放在文件内

也可以帐号和密码都写在文件里 一个帐号密码卸载一行 中间用逗号分割

步骤:

在当前路径下新建一个文件夹 data 用于存放数据 在data文件夹内 新建一个文件 写入测试的账户数据

把txt文件内的数据读取出来 进行拼接

    @task(2)
    def test_login(self):
        #取出WebSite用户类中的uiserdata 调用choice进行随机取值
        userinfo = choice(self.locust.userdata)
        username = userinfo.split(',')
        data =  {"phone":userinf[0],"password":username[1] }
        res = self.client.post("/login/login",headers=hraders,data=data,name="登录")
        assert res.status_code == 200

class WebSite(HttpLocust):
    """该类 用于配置用户请求"""
    userdata =  []
    host = "http://qgyilingmuyan.com/api/common"
    task_set = TestIndex
    wait_time = between(1,2)
    #读取出文件内的数据
    with open("data/username.txt",'r') as file:
        #每次循环遍历一行数据
        for line in file.readlines():
            #去掉前后空格后 追加到userdata数组里
            userdata.append(line.strip())

参数的上下关联

下一个接口需要上一个接口的依赖参数才可以正常请求 在实际项目很多都是这样的接口 列如 :查看我的页面必须要登录接口的token或Cookeis才可以被访问

步骤:

  • ​ 在登录接口把取出的token添加到headers里
  • ​ 然后我的接口直接调用就行(headers这个字典之前已经设置成全局变量了)
        
    @task(2)
    def test_login(self):
        data =  {"phone":12345678987,"password":123456 }
        res = self.client.post("/login/login",headers=headers,data=data,name="登录")
        assert res.status_code == 200
        headers['token']= res.json()['data']['token']
        
    @task(2)
    def user_myinfo(self):
        res = self.client.post("/user/my_info",headers=headers,name="我的")
        assert res.status_code == 200
        print(res.json())

分布式压测

如果压测电脑的CPU有四个内核 那么利用locust执行一次压测 用户数是50 locust就会在一个CPU内核中释放50个协程进行压力测试 另外三个内核是闲置的 为了达到资源利用的目的 所以可以使用分布式压测

分布式压测的原理:

​ 分布式有有两种机器组成 :

  • ​ 控制机(主机): master
  • ​ 资源机(从机):slave

控制机只能有一个 资源机可以有N个 意思就是一个控制机 带动多个资源机去压测项目

在运行脚本的时候 master是不用于脚本的 都是 slave在执行 。多个slave既可以在同一台电脑上 也可以在不同的电脑上

在同一台电脑上运行多个slave:

说完了原理后 先做一下 在同一台设备上运行 首先 需要启动maste 控制机

启动的方法 就是原有的基础的后面 加一个 --maste 就可以了

locust -f TestIndex.py --web-host="127.0.0.1" --maste

这个时候 打开浏览器的locust的 ui界面 会发现右上角就多了slaves的显示 因为还没有添加任何的slaves所以显示为0

然后如果现在输入10用户数 去跑这个脚本 是不会运行的 因为master只负责管理控制 资源机 它不执行脚本

控制机开启后 再打开一个DOS命令

locust -f TestIndex.py --slave --web-host="127.0.0.1"

这时候再打开locust的UI界面 就看到slaves变成了1

如果电脑的cpu有4个内核 每开启一个slaves服务都会在一个内核里释放一些协程 那么这台电脑除去一个控制机外 可以开3个slaves服务

在不同的电脑上运行多个slave

​ 在另一 台用户当作资源机的电脑上进行分布式压测 资源电脑需要安装环境 如python和locust等 (版本尽量保持一致)

​ DOS命令开启服务 和在同一台电脑上不同的是 需要指定master控制机的ip

locust -f TestIndex.py --slave --master-host="192.xxx.xxx"

你可能感兴趣的:(性能测试,编程语言)