扼要:
1、了解locust进行性能测试的实例;
2、独立编写locust性能测试代码;
本文主要讲述用python的locust库进行性能测试。
Locust是一个python代码编写的开源负载测试工具。其支持模拟成千上万的用户,可分布式;报告、运行情况可支持网页观看。
Locust环境搭建
1、安装python,下载地址:https://www.python.org/downloads/
2、安装读取excel的库xlrd,安装命令:pip install xlrd
3、安装locust,安装命令:pip install locust==1.3.1(因为本教程用的locust版本为1.3.1)
简单语法说明
1、简单代码示例
# 基本都需要导入HttpUser, between, task
from locust import HttpUser, between, task
class WebsiteUser(HttpUser):
# 思考时间区间在5-15秒
wait_time = between(5, 15)
# 进行初始化的工作,每个Locust用户开始做的第一件事
def on_start(self):
self.client.get("/home")
# 通过@task()装饰的方法为一个事务,参数用于指定该行为的执行权重,参数越大每次被虚拟用户执行的概率越高,默认为1
@task
def index(self):
# self.client属性使用Python request库的所有方法,调用和使用方法和requests完全一致;
self.client.get("/user")
self.client.get("/details")
格式如下:
简单实例
2、运行脚本:
终端中--->进入到代码目录: locust -f ***.py --host=***.com
3、在浏览器输入:localhost:8089,即可访问locust的设置页面,如下图:
web操作
4、更多资料可参考官方文档:https://www.locust.io/
实例说明
本次采用locust读取Excel表格中的接口进行每个接口压测。
1、Excel表格的内容格式
1.1、接口格式如下:
接口参数表格格式
1.2、用户参数格式如下:
用户参数表格格式
1、Locust代码解说:
1.1、登录函数
def login(self,name,pwd):
'''登录返回 token'''
self.name=name
self.pwd=pwd
payload ={"name":self.name,"password":self.pwd}
header = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"Content-Type": "application/json;charset=utf-8",
"pl":"h5"
}
# 登录
res=self.client.post("/login",name="登录",data=json.dumps(payload),headers=header).text
resJson=json.loads(res)
message = resJson['message']
if message == "登录成功":
pass
else:
print("No pass,登录不成功")
token=resJson['data']['auth']['token']
# 返回当前用户token
return token
1.2、读取两个Excel表格的参数
try:
# 接口参数文件
self.work = xlrd.open_workbook(parentdir + 'pythonProject/interfaceData.xlsx')
# 用户名登录参数文件
self.loginExcel=xlrd.open_workbook(parentdir + 'pythonProject/login.xlsx')
except:
print('无没有存在参数文件!')
exit('退出程序,请添加参数文件!')
# 接口参数文件的表格
self.sheetName=self.work.sheet_by_name('test')
rowNum = self.sheetName.nrows
# 用户名登录参数文件的表格
self.loginName=self.loginExcel.sheet_by_name('namepwd')
rowNumLogin = self.loginName.nrows
1.3、处理接口和登录用户两个参数文件逻辑
# 登录用户名参数化
for h in range(1,rowNumLogin):
name = self.loginName.cell_value(h, 0)
pwd = self.loginName.cell_value(h, 1)
# 登录
print("第" + str(h) + "个用户:" + name)
restoken = self.login(name,pwd)
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"pl": "h5",
"Authorization": restoken
}
# 接口处理逻辑
for i in range(1,rowNum):
print(self.sheetName.cell_value(i, 0))
methodExcel=self.sheetName.cell_value(i, 1)
nameExcel = self.sheetName.cell_value(i, 2)
payload = self.sheetName.cell_value(i, 3)
# get方法
if methodExcel=='get':
meg = self.client.get(self.sheetName.cell_value(i, 0)+str(restoken[1])+"?"+payload, name=nameExcel, params=None,headers=header).text
megJson = json.loads(meg)
message = megJson['message']
if message == "ok" or message == "操作成功":
pass
else:
print("No pass")
# post方法
# 上次图片
if methodExcel=="post" and nameExcel=='upload':
meg = self.client.post(self.sheetName.cell_value(i, 0), name=nameExcel, params=payloadUp,files=files,headers=header).text
megJson = json.loads(meg)
message = megJson['message']
if message == "ok" or message == "操作成功":
pass
else:
print("No pass")
# 非传图片
if methodExcel=="post" and nameExcel!='upload':
payload = json.loads(payload)
header = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"pl": "h5",
"Authorization": restoken,
"Content-Type":"application/json;charset=utf-8"
}
meg = self.client.post(self.sheetName.cell_value(i, 0), name=nameExcel, params=payload,headers=header).text
megJson = json.loads(meg)
message = megJson['message']
print(megJson)
if message == "ok" or message == "操作成功" :
pass
else:
print("No pass")
# 注册用户
if methodExcel=="post" and methodExcel=="注册":
payload = json.loads(payload)
header = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"pl": "h5",
"Content-Type": "application/json"
}
meg = self.client.post(self.sheetName.cell_value(i, 0), name=nameExcel, params=payload,headers=header).text
megJson = json.loads(meg)
message = megJson['message']
print(megJson)
print(restoken[0])
if message == "ok" or message == "操作成功" or message == '登录成功' or message=='账号已经被使用':
pass
else:
print("No pass")
# put 方法
if methodExcel=="put":
payload = json.loads(payload)
header = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"pl": "h5",
"Authorization": restoken,
"Content-Type":"application/json;charset=utf-8"
}
meg = self.client.put(self.sheetName.cell_value(i, 0),name=nameExcel, params=payload, headers=header).text
megJson = json.loads(meg)
state = megJson['state']
print(payload)
print(megJson)
if state == 884 or state == 0 or state==187:
pass
else:
print("No pass")
1.4、完整代码
完整代码如下:
接下图
承接上下图
承接上下图
最后小编在学习过程中整理了一些学习资料,可以分享给做软件测试工程师的朋友们,相互交流学习,需要的可以加入我的学习交流群 164549428 或加微dingyu-003即可免费获取Python自动化测开及Java自动化测开学习资料(里面有功能测试、性能测试、python自动化、java自动化、测试开发、接口测试、APP测试等多个知识点的测试资料)