本节学习内容:
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
分布式控制界面
六、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分布式运行
欢迎来到testingpai.com!
注册 关于