一谐腰、參數(shù)化
a孕豹、跟接口自動(dòng)化測試一樣,實(shí)際性能測試中不可避免需要進(jìn)行參數(shù)化十气,簡單的把遇到的場景分成二類:
1励背、所有用戶隨機(jī)取數(shù),數(shù)據(jù)可以重復(fù)使用
解決方案:將數(shù)據(jù)存儲在文件中砸西,測試時(shí)可讀取出來再隨機(jī)取數(shù)
2叶眉、所有用戶順序循環(huán)取數(shù)址儒,數(shù)據(jù)可以重復(fù)使用
解決方案:將數(shù)據(jù)存儲到隊(duì)列中,取出一個(gè)數(shù)據(jù)后再將其壓入隊(duì)列中(不能重復(fù)使用就不壓入了)
b衅疙、先啟動(dòng)一個(gè)本地服務(wù)
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莲趣,記得替換
代碼采用隊(duì)列方案進(jìn)行參數(shù)化,數(shù)據(jù)可重復(fù)使用
from locust import HttpUser, TaskSet, task,between
import json,datetime
import queue
#定義一個(gè)隊(duì)列饱溢,把準(zhǔn)備的數(shù)據(jù)放進(jìn)去
def GetData():
s=queue.Queue(maxsize=0)
for i in range(1,6):
#往隊(duì)列里面壓入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調(diào)用websitUser類里面的數(shù)據(jù)
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_)#將剛剛?cè)〉臄?shù)據(jù)重新丟進(jìn)列隊(duì)
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)
點(diǎn)擊執(zhí)行喧伞,輸出每次請求的結(jié)果如下
可以看出我們參數(shù)化一次取出的參數(shù)是1、2绩郎、3絮识、4、5嗽上,請求api之后次舌,依次返回的3、4兽愤、5彼念、6、7
二浅萧、關(guān)聯(lián)參數(shù)
跟接口測試一樣逐沙,我們經(jīng)常需要將上一個(gè)接口返回的參數(shù)用于第二次請求
業(yè)務(wù)場景:用戶需要先登錄獲取token,之后去加入購物車洼畅、下訂單吩案、充值等等行為都是需要用到這個(gè)身份驗(yàn)證
解決方案:客戶不是每次行為都需要登錄,每個(gè)客戶只需要登錄一次就可以得到這個(gè)token帝簇,之后的行為就只需要攜帶這個(gè)token即可辨別身份徘郭,locust里面有個(gè)on_start函數(shù),就是在每個(gè)客戶啟動(dòng)之前需要執(zhí)行的步驟丧肴,且僅僅執(zhí)行一次
from locust import HttpUser, TaskSet, task,between
import json,random
class MyLocust(TaskSet):
def on_start(self):
#模擬一次請求的返回值残揉,假設(shè)每次返回值都不固定
res=random.randint(10,15)
self.res=res#將返回值掛在這個(gè)類上,在其他地方就能直接訪問了
@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 關(guān)聯(lián)參數(shù).py --host=http://192.168.50.209:8009"
os.system(cmd)
執(zhí)行函數(shù)結(jié)果如下:
從圖中可以看出芋浮,我們模擬了兩個(gè)客戶請求抱环,第一步先得到一個(gè)返回值,即11和14纸巷,之后多次循環(huán)第二次請求镇草,每次都是返回13和16,證明我們的思路是成功的