locust性能測試實戰
一、在Linux上面部署好locust工具
1)安裝python3.6.9版本
先安裝OpenSSL
# yum -y install openssl*
解壓安裝包
# tar -xf Python-3.6.9.tar.xz
# cd Python-3.6.9/
# ./configure --prefix=/usr/local/python3 --with-ssl
# make && make install
創建軟鏈接
# ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
# ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
升級pip工具
# pip3 install --upgrade pip
2)安裝locust工具
使用以下命令進行安裝:
檢查是否安裝成功:看到有幫助信息,說明安裝成功了
# locust --help
若是沒有上面的信息,能夠本身配置環境變量,
以下:配置環境變量,找到locust安裝目錄 # vim /etc/profile export PATH=$PATH:/usr/local/python3/bin/ # source /etc/profile 查看有沒有生效: # locust -h
二、在windows上面安裝好locust工具
首先確保本身安裝了python3.0以上版本
在dos窗口中,使用命令:
使用locust -h查看是否安裝成功
三、在pycharm裏面開發(get,post)請求
在pycharm中建立get請求的文件locust_get.py,文件內容以下:
from locust import TaskSet,task,HttpLocust
class LocustApi(TaskSet):
@task()
def get_types(self):
respose = self.client.get("/mobile/api/goods/gettypes")
result = respose.json()
# 斷言
#assert result['code'] ==0
if result['code']==0:
print('Pass_get')
else:
print('Fail_get')
class WebsiteUser(HttpLocust):
task_set = LocustApi
min_wait = 3000 # 模擬負載的任務之間執行時的最小等待時間,單位爲毫秒
max_wait = 6000 # 模擬負載的任務之間執行時的最大等待時間,單位爲毫秒
#stop_timeout = 60000
if __name__ == "__main__":
import os
運行結果爲:
在pycharm中建立get請求的文件locust_post.py,文件內容以下:
import json
import random
from locust import TaskSet,task,HttpLocust
class ApiLogin(TaskSet):
# 登陸
@task()
def login(self):
headers = {'content-type':'application/json'}
params = {'mobile':'18262989777','password':'123456'}
data = json.dumps(eval(str(params)))
data = data.encode('utf-8')
self.client.post('/mobile/api/user/login',data,headers=headers)
class WebsiteUser(HttpLocust):
task_set = ApiLogin
min_wait = 3000 # 模擬負載的任務之間執行時的最小等待時間,單位爲毫秒
max_wait = 6000 # 模擬負載的任務之間執行時的最大等待時間,單位爲毫秒
stop_timeout = 300 # 設置多少秒中止,是這個場景要跑多長的時間,若是不設置這個字段,腳本會一直運行
if __name__=="__main__":
import os
# 啓動locust
os.system("locust -f locust_post.py --host=host")
在pycharm中運行腳本,如圖所示:
四、跑性能測試場景,並熟悉每一個參數的含義
#!/usr/bin/env python
#-*-coding:utf-8-*-
#@Time:2019/7/25 14:48
#@Author:xiaoxian
#@File: api_get_post.py
from locust import TaskSet, HttpLocust, task
import json
import random
class LocustApi(TaskSet):
# 獲取商品列表
@task(1)
def get_types(self):
response = self.client.get("/mobile/api/goods/gettypes")
result = response.json()
# 斷言
# assert result['code'] == 0
if result['code'] == 0:
print('Pass_get')
else:
print('Fail_get')
@task(2)
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("/mobile/api/user/login", data, headers=headers)
result = response.json()
# 斷言
# assert result['code'] == 0
if result['code'] == 0:
print('Pass_post')
else:
print('Fail_post')
class WebsiteUser(HttpLocust):
task_set = LocustApi
min_wait = 3000 # 單位毫秒
max_wait = 6000 # 單位毫秒
if __name__ == "__main__":
import os
# 啓動locust,
os.system("locust -f api_get_post.py --host=host")
五、locust設置斷言
# 斷言
第一種方法:
assert result['code'] ==0
第二種方法:
if result['code']==0:
print('Pass_get')
else:
print('Fail_get')
六、locust參數化
# readline獲取每一行數據保存在list,每一行數據是一個元素,字符串形式,
#這裏變量轉爲int 能夠去掉換行符號在append一個新數據
with open("D:\\python\\locust\\mobile.txt") as f:
mobile_id = f.readline()
mobile_ids = []
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)
七、locust混合場景執行
# 裝飾該方法表示爲用戶行爲,括號裏面參數表示該行爲的執行權重,數值越大,執行頻率越高,默認是1
@task(1)
def get_types(self):
……
@task(2)
def login(self):
……
備註:具體腳本內容查看標題4的內容
八、locust分佈式運行
實現分佈式壓測,須要在主機中使用--master標記來啓用一個locust示例,可是master節點的機器不會發起請求,只會收集數據展現,在從機使用--save標記啓動一條到多臺locust salve機器節點,與標記----master-host一塊兒使用(指出master機器的ip/hostname)
主機啓動:
locust -f locust_get.py --master WebsiteUser
啓動從機:
注意:兩個腳本要一致
九、命令行運行
locust啓動命令
-f 指定性能測試腳本文件
--host指定被測試應用的URL的地址
no-web 模式運行測試
啓動參數:
--no-web:表示不使用web界面運行測試
-c:表示設置虛擬用戶數
-r:設置每秒啓動虛擬用戶數
-t:設置運行時間
十、locust的UI界面
1)啓動界面
Number of users to simulate:設置模擬的用戶總數Hatch rate (users spawned/second):每秒啓動的虛擬用戶數
Start swarming:執行locust腳本
2)測試結果界面
PS:點擊STOP能夠中止locust腳本運行:
Type:請求類型,即接口的請求方法;
Name:請求路徑;
requests:當前已完成的請求數量;
fails:當前失敗的數量;
Median:響應時間的中間值,即50%的響應時間在這個數值範圍內,單位爲毫秒;
Average:平均響應時間,單位爲毫秒;
Min:最小響應時間,單位爲毫秒;
Max:最大響應時間,單位爲毫秒;
Content Size:全部請求的數據量,單位爲字節;
reqs/sec:每秒鐘處理請求的數量,即QPS;
3)各模塊說明
New test:點擊該按鈕可對模擬的總虛擬用戶數和每秒啓動的虛擬用戶數進行編輯;
Statistics:相似於jmeter中Listen的聚合報告;
Charts:測試結果變化趨勢的曲線展現圖,分別爲每秒完成的請求數(RPS)、響應時間、不一樣時間的虛擬用戶數;
Failures:失敗請求的展現界面;
Exceptions:異常請求的展現界面;
Download Data:測試數據下載模塊, 提供三種類型的CSV格式的下載,分別是:Statistics、responsetime、exceptions;