locust 完成性能测试 (二)

本贴最后更新于 1575 天前,其中的信息可能已经时移世异

本节学习内容:

1、locust开发post请求

2、locust设置断言

3、locust参数化

4、locust混合场景执行

5、locust分布式运行

一、locust开发post请求
新建:locust_post.py文件

import json

import random

from locust import TaskSet, task, HttpUser, between

class ApiLogin(TaskSet):

@task()

def login(self):
   #加上登录请求的请求头信息

    headers = {'content-type': 'application/json'}
    
  #登录的请求体内容
    params = {"mobile": "15800000002", "password": "123456"}
    
  #进行json的反序列
    data = json.dumps(eval(str(params)))

  #请求内容的编码方式
    data = data.encode('utf-8')

  #发起post请求,包括接口地址,请求体,请求头
    self.client.post("/app/mobile/api/user/login", data, headers=headers)

class HttpRun(HttpUser):

// 老版本:task_set = ApiLogin

// 新版本
tasks = [ApiLogin]

等待时间

wait_time = between(1, 5)

host = "http://192.168.228.147:8080"

if name == "main":
import os
os.system("locust -f locust_post.py HttpRun")

二、断言

with self.client.get("/mobile/api/goods/gettypes", catch_response=True) as response:

        if "成功调用" in response.text:

            response.success()

        else:

            response.failure('Failed!')

三、参数化
with open("D:\python\locust\mobile.txt") as f:

        mobile_id = f.readlines()

    mobile_ids = []

    # readlines获取每一行数据保存为list,每一行数据是一个元素,字符串形式,

    # 这里要遍历转为int可以去掉换行符号再append一个新数组。

    for i in mobile_id:

        data = int(i)

        mobile_ids.append(data)

    ran = random.randint(0, 5)

    # 随机取出一个数据

    mobile_id = mobile_ids[ran]

    mobile = str(mobile_id)

完整的脚本
import json

import random

from locust import TaskSet, task, HttpUser, between

class ApiLogin(TaskSet):

# 登录

@task

def login(self):

    # 用python代码去读取文件的内容

    with open("D:\\python\\locust_0530\\mobile.txt") as f:

        mobile_id = f.readlines()

    mobile_ids = []

    # readlines获取每一行数据保存为list,每一行数据都是一个元素,字符串形式

    # 这里要遍历转为int可以去掉换行符号在append一个新数组

    for i in mobile_id:

        data = int(i)

        mobile_ids.append(data)

    ran = random.randint(0, 5)

    # 随机取出一个数据

    mobile_id = mobile_ids[ran]

    mobile = str(mobile_id)

    headers = {'content-type': 'application/json'}

    params = {"mobile": mobile, "password": "123456"}

    data = json.dumps(eval(str(params)))

    data = data.encode('utf-8')

    url = "/app/mobile/api/user/login"

    response = self.client.post(url, data, headers=headers)

    result = response.json()

    # 断言

    if result['code'] == 0:

        print('Pass_post')

    else:

        print('Failure!')

class HttpRun(HttpUser):

tasks = [ApiLogin]

wait_time = between(1, 5)

host = "http://192.168.228.147:8080"

if name == "main":

import os

os.system("locust -f locust_post.py HttpRun")

四、混合场景执行

在定义的函数前面加上task,括号里面的数字代表权重的比重

@task(1)

def get_types(self):

@task(2)

def login(self):

上面就是执行一次get_types,会执行两次login操作

完整的脚本:
from locust import TaskSet, HttpLocust, task, HttpUser, tag

import json

import random

class LocustApi(TaskSet):

# 获取商品列表

@task(1)    # 分配不一样的权重

def get_types(self):

    response = self.client.get("/app/mobile/api/goods/gettypes")

    result = response.json()

    # 断言

    assert result['code'] == 0

    if result['code'] == 0:

        print('Pass_get')

    else:

        print('Failure!')

@task(2)

@tag("tag1")

def login(self):

    with open("D:\\python\\locust\\mobile.txt") as f:

        mobile_id = f.readlines()

    mobile_ids = []

    # readlines获取每一行数据保存为list,每一行数据是一个元素,字符串形式,

    # 这里要遍历转为int可以去掉换行符号再append一个新数组。

    for i in mobile_id:

        data = int(i)

        mobile_ids.append(data)

    ran = random.randint(0, 5)

    # 随机取出一个数据

    mobile_id = mobile_ids[ran]

    mobile = str(mobile_id)

    headers = {'content-type': 'application/json'}

    params = {"mobile": mobile, "password": "123456"}

    data = json.dumps(eval(str(params)))

    data = data.encode('utf-8')

    response = self.client.post("/app/mobile/api/user/login", data, headers=headers)

    result = response.json()

    # 断言

    # assert result['code'] == 0

    if result['code'] == 0:

        print('Pass_post')

    else:

        print('Failure!')

class WebsiteUser(HttpUser):

tasks = [LocustApi]

min_wait = 3000  # 单位毫秒

max_wait = 6000  # 单位毫秒

host = "http://192.168.228.147:8080"

if name == "main":

import os

# 启动locust,

os.system("locust -f locust_get_post.py  WebsiteUser")

五、locust分布式运行

为了实现分布式压测,需要在主机中使用--master标记来启用一个locust实例。但是master节点的机器不会发起请求,只会收集数据展示,在从机使用--save标记启动一台到多台locust salve机器节点,与标记--master-host一起使用(指出master机器的ip/hostname)。

注意:master和每一台salve机器,在运行分布式测试时都必须要有locust的测试文件

在master模式下启动locust

locust -f api_get_post.py --master

在每个slave中执行(192.168.228.130替换你master的IP)

os.system("locust -f locust_get.py --worker --master-host=192.168.228.130 WebsiteUser")

或者在Linux机器上面开启从机:

locust -f locust_get.py --worker --master-host=192.168.64.1 --host=http://192.168.226.128:8080

分布式控制界面

image.png

六、locust no-web模式

命令行运行locust测试

#[root@localhost data]#locust -f locust_api.py --host=http://192.168.226.147:8080 --headless -u 10 -r 2 -t 1m

启动参数:

老版本:--no-web 表示不使用Web界面运行测试。(headless 新)

老版本:-c:设置虚拟用户数

-u 设置虚拟用户数。

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

-t 设置运行时间。

作业:

1、locust开发post请求

2、locust设置断言

3、locust参数化

4、locust混合场景执行

5、locust分布式运行

回帖
请输入回帖内容 ...