一、参数化
a、跟接口自动化测试一样,实际性能测试中不可避免需要进行参数化,简单的把遇到的场景分成二类:
1、所有用户随机取数,数据可以重复使用
解决方案:将数据存储在文件中,测试时可读取出来再随机取数
2、所有用户顺序循环取数,数据可以重复使用
解决方案:将数据存储到队列中,取出一个数据后再将其压入队列中(不能重复使用就不压入了)
b、先启动一个本地服务
import json
from flask_cors import CORS
app = Flask(__name__)
# 允许跨域
CORS(app, resources=r'*')
@app.route('/sum', methods=['POST'])
def sum():
a = json.loads(request.data).get('a')
b = json.loads(request.data).get('b')
res = {"status": 200, "data": a + b}
return json.dumps(res)
if __name__ == '__main__':
app.run(host='192.168.50.209', port=8009, debug=True)#这是我本地ip,记得替换
代码采用队列方案进行参数化,数据可重复使用
from locust import HttpUser, TaskSet, task,between
import json,datetime
import queue
#定义一个队列,把准备的数据放进去
def GetData():
s=queue.Queue(maxsize=0)
for i in range(1,6):
#往队列里面压入1,2,3,4,5
s.put_nowait(i)
return s
class MyLocust(TaskSet):
@task()
def post_test(self):
url='/sum'
data_=self.user.queueData.get()#self.user调用websitUser类里面的数据
data={"a":2,"b":data_}
with self.client.post(url,json.dumps(data),verify=False) as response:
print(json.loads(response.content))#打印返回值
response.success()
assert response.status_code == 200
self.user.queueData.put(data_)#将刚刚取的数据重新丢进列队
class websitUser(HttpUser):
tasks = [MyLocust]
wait_time = between(1, 3)
queueData=GetData()
if __name__ == '__main__':
import os
cmd="locust -f test_locust.py --host=http://192.168.50.209:8009"
os.system(cmd)
点击执行,输出每次请求的结果如下
1657268132579.jpg
可以看出我们参数化一次取出的参数是1、2、3、4、5,请求api之后,依次返回的3、4、5、6、7
二、关联参数
跟接口测试一样,我们经常需要将上一个接口返回的参数用于第二次请求
业务场景:用户需要先登录获取token,之后去加入购物车、下订单、充值等等行为都是需要用到这个身份验证
解决方案:客户不是每次行为都需要登录,每个客户只需要登录一次就可以得到这个token,之后的行为就只需要携带这个token即可辨别身份,locust里面有个on_start函数,就是在每个客户启动之前需要执行的步骤,且仅仅执行一次
from locust import HttpUser, TaskSet, task,between
import json,random
class MyLocust(TaskSet):
def on_start(self):
#模拟一次请求的返回值,假设每次返回值都不固定
res=random.randint(10,15)
self.res=res#将返回值挂在这个类上,在其他地方就能直接访问了
@task()
def post_test(self):
url='/sum'
data={"a":2,"b":self.res}
with self.client.post(url,json.dumps(data),verify=False,catch_response=True) as response:
print(json.loads(response.content))
response.success()
assert response.status_code == 200
class websitUser(HttpUser):
tasks = [MyLocust]
wait_time = between(1, 3)
if __name__ == '__main__':
import os
cmd="locust -f 关联参数.py --host=http://192.168.50.209:8009"
os.system(cmd)
执行函数结果如下:
1657269827214.jpg
从图中可以看出,我们模拟了两个客户请求,第一步先得到一个返回值,即11和14,之后多次循环第二次请求,每次都是返回13和16,证明我们的思路是成功的