背景:壓測某一個功能點的時候,系統存在校驗機制,一個賬戶的token信息,只允許操作一個vuser(類似一個功能點,當兩個相同的賬號去訪問的時候,第一個會訪問成功,第二個就會訪問失敗)。所以只能對登錄的賬戶進行參數。
參考了https://www.cnblogs.com/grandlulu/p/9264819.html ,運用隊列任務消費,來實現不同賬號的登錄,附上大佬的源代碼
from locust import HttpLocust, TaskSet, task
import queue
class test_taskset(TaskSet):
@task
def register(self):
try:
data = self.locust.queueData.get() //獲取隊列裏的數據
print(data)
except queue.Empty: //隊列取空後,直接退出
print('no data exist')
exit(0)
print('actually user and password is {} and {}'.format(data['username'], data['password']))
payload = {
'username': data['username'],
'password': data['password'],
}
self.client.post('/register', data=payload) //POST方法發送請求
class test_run(HttpLocust):
host = '192.168.1.100:16060'
task_set = test_taskset
queueData = queue.Queue() //隊列實例化
for count in range(100): //循環數據生成
data = {
"username": "test%d" % count,
"password": "pwd%d" % count,
"email": "test%[email protected]" % count,
}
queueData.put_nowait(data)
對locust執行中發現,多用戶執行的時候,每個vuser都會初始化一次register,所以隊列池要對所有vuser共享,就只能放到test_run類中,這樣就可以實現了。上面要注意的地方 一個是隊列任務要實現共享,第二個就是獲取線程池的值的時候,用的是
self.locust.queueData.get(),就能獲取到裏面的值了。
擴展:如果生成的是一個需要處理的任務池,比如刪除系統的訂單,這樣獲取訂單號的操作就不能放到register中了,因爲register只會初始化一次。所以得放到執行函數中。
具體的demo明天補充,下班~~~~~~~~~~~~