python locust的基本使用


python + locust 記錄一次性能測試的實施

 

前言

一直以來都是使用的工具壓測系統接口,常用JMETER ,后面學習python,發現還能用腳本去測試系統性能,迫不及待試了一次,記錄下

 

實施

安裝python環境是自然要的,加上配置環境變量啥的,這些網上一大把,這里就不詳述了。

要用到的python庫locust (官方文檔:Locust說明文檔

一、認識Locust

1、定義

Locust是一款易於使用的分布式負載測試工具,完全基於事件,即一個locust節點也可以在一個進程中支持數千並發用戶,不使用回調,通過gevent使用輕量級過程(即在自己的進程內運行)。

# gevent是第三方庫,通過greenlet實現協程。greenlet是python的並行處理的一個庫。 python 有一個非常有名的庫叫做 stackless ,用來做並發處理, 主要是弄了個叫做tasklet的微線程的東西, 而greenlet 跟stackless的最大區別是greenlet需要你自己來處理線程切換, 就是說,你需要自己指定現在執行哪個greenlet再執行哪個greenlet。

2、特點

①、不需要編寫笨重的UI或者臃腫的XML代碼,基於協程而不是回調,腳本編寫簡單易讀;

②、有一個基於web簡潔的HTML+JS的UI用戶界面,可以實時顯示相關的測試結果;

③、支持分布式測試,用戶界面基於網絡,因此具有跨平台且易於擴展的特點;

④、所有繁瑣的I / O和協同程序都被委托給gevent,替代其他工具的局限性;

3、locust與jmeter的區別

工具 區別
jmeter 需要在UI界面上通過選擇組件來“編寫”腳本,模擬的負載是線程綁定的,意味着模擬的每個用戶,都需要一個單獨的線程。單台負載機可模擬的負載數有限
locust 通過編寫簡單易讀的代碼完成測試腳本,基於事件,同樣配置下,單台負載機可模擬的負載數遠超jmeter

PS:但locust的局限性在於,目前其本身對測試過程的監控和測試結果展示,不如jmeter全面和詳細,需要進行二次開發才能滿足需求越來越復雜的性能測試需要。

二、安裝Locust

1、支持的python版本:2.7、3.4、3.5、3.6;

2、Windows系統安裝locust

①、直接通過 pip install locustio 命令安裝;

②、安裝成功后可以輸入 pip show locust 命令查看是否安裝成功,以及通過 locust -help 命令查看幫助信息。

PS:運行大規模測試時,建議在Linux機器上執行此操作,因為gevent在Windows下的性能很差。

三、一個簡單的示例

locust里面請求是基於requests的,每個方法請求和requests差不多,請求參數、方法、響應對象和requests一樣的使用,之前學過requests庫的,這里就非常簡單了

  • requests.get 對應client.get
  • requests.post 對應client.post
復制代碼
 1 from locust import HttpLocust,TaskSet,task
 2 
 3 class Demo(TaskSet):
 4     '''例子'''
 5     @task(1)
 6     def baidu(self):
 7         url = '/huahuage/p/12917114.html'
 8         header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
 9         req = self.client.get(url, headers=header, verify=False)
10 
11         if req.status_code == 200:
12             print("success")
13         else:
14             print("fails")
15             
16 class websitUser(HttpLocust):
17     task_set = Demo
18     min_wait = 3000
19     max_wait = 6000
20 
21 if __name__=="__main__":
22     import os
23     os.system("locust -f demo.py --host=https://www.cnblogs.com")
 

 

2. 設置tasks的兩種方式

from locust import HttpLocust, TaskSet, task def index(l): l.client.get("/") def stats(l): l.client.get("/stats/requests") class UserTasks(TaskSet): # 列出需要測試的任務形式一 tasks = [index, stats] # 列出需要測試的任務形式二 @task def page404(self): self.client.get("/does_not_exist") class WebsiteUser(HttpLocust): host = "http://127.0.0.1:8089" min_wait = 2000 max_wait = 5000 task_set = UserTasks

 3. 設置登錄只運行一次的代碼,后續請求不需要再次登錄

from locust import HttpUser, TaskSet, task
import subprocess
import json # abc


# 性能測試任務類 TaskSet.
class UserBehavior(TaskSet):
# 登錄截取token
def doLogin(self):
# 只寫路徑即可
login_url = "/login/accountLogin"
# 由於本例中的timestamp和每個接口請求的sign一段時間內是不變的,所以直接使用抓取的接口數據
# 密碼可直接從接口中抓取已加密過的數據,也可在腳本中根據規則轉換
login_params = {
"_sign": "833e83c223faf3ef446573d05618d150",
"_timestamp": "1626312457295",
"_v": "1.0.0",
"os": "android",
"password": "yourpassword",
"terminal": "1",
"username": "yourname",
"uuid": "youruuid"
}
response = self.client.post(url=login_url, params=login_params)
ret = json.loads(response.content)["results"]["ret"]
if ret == 200:
print(u"登錄成功")
print(json.dumps(ret, ensure_ascii=False))
else:
print(u"登錄失敗")
print(ret)
# 此處獲取的token,可在后面的函數中使用
self.token = json.loads(response.content)["results"]["data"]["access_token"]
if self.token != 0:
print(self.token)
return self.token
# 在進行壓測前,執行一次
def on_start(self):
print("--------------登錄獲取token--------------")
self.doLogin()

# 任務,數字表示權重,數字越大,執行的概率越高
@task(1)
def getTagVals(self):
global token
u"""
request_url:請求路徑
request_params:請求頭參數
request_json:請求json參數
"""
request_url = "/video/commitComment"

request_params = {

"_sign": "833e83c223faf3ef446573d05618d150",
"_timestamp": "1626312457295",
"_v": "1.0.0",
"content": "2222",
"key": "9db6b3345fbd41c7bd42e239e655fce7",
"os": "android",
"terminal": "1",
# 調用獲取的token
"token": self.token,
"uuid": "youruuid"

}

response = self.client.post(
url=request_url,
params=request_params,
)
# 這里可以編寫自己需要校驗的返回內容
content = json.loads(response.content)["results"]["ret"]
if content == 200:
print(u"評論成功")
print(json.dumps(content, ensure_ascii=False))
else:
print(u"評論失敗")
print(content)


# 性能測試配置
class MobileUserLocust(HttpUser):
u"""
min_wait :用戶執行任務之間等待時間的下界,單位:毫秒。
max_wait :用戶執行任務之間等待時間的上界,單位:毫秒。
"""
# weight = 3
tasks = [UserBehavior]
host = "https://*****.cn"
min_wait = 3000
max_wait = 6000


if __name__ == "__main__":
subprocess.Popen("locust -f main_pt.py", shell=True)

 

 

 

這是轉載別人的,我自己直接運行這個python文件,提示 terminal is not a tty terminal ,然后就在pycharm下邊的terminal下邊直接運行locust命令,然后就可以了

另外一點,就是運行了locust命令之后了,只是啟動了這個服務,http://localhost:8089,然后在瀏覽器中輸入這個地址,然后輸入虛擬用戶數和啟動時間,然后點擊start運行才會真正的開始發情請求

 

問題1:直接在pycharm下直接運行py文件,提示 terminal is not a tty terminal ,然后就在pycharm下邊的terminal下邊直接運行locust命令,然后就可以了

問題2:今天開始自己寫了請求,開始跑,然后發現在UI的頁面的報告的地方,沒有顯示請求數量,然后對比了一下,因為自己沒有調用user de client ,自己直接寫請求是不行的,修改后就可以了

requests.post(url=path, data=json.dumps(data), headers=headers, verify=True) ------修改前

res=self.client.post(url=path, data=json.dumps(data), headers=headers, verify=True)--------修改后


問題3:在terminal終端運行時,剛開始切換到當前.py文件所在目錄運行,提示找不到引用的模塊,然后切換目錄至項目的根目錄下開始運行,然后就可以了

 

 

 

腳本說明

新建一個類Demo(TaskSet),繼承TaskSet,該類下面寫需要請求的接口以及相關信息;

self.client調用get和post方法,和requests一樣;

@task裝飾該方法表示為用戶行為,括號里面參數表示該行為的執行權重:數值越大,執行頻率越高,不設置默認是1;

WebsiteUser()類用於設置性能測試。

task_set:指向定義了用戶行為的類

min_wait :模擬負載的任務之間執行時等待時間的下界,單位:毫秒

max_wait :模擬負載的任務之間執行時等待時間的上界,單位:毫秒

PS:默認情況下,時間是在min_wait和max_wait之間隨機選擇,但是可以通過將wait_function設置為任意函數來使用任何用戶定義的時間分布。

四、啟動Locust

1、如果啟動的locust文件名為locustfile.py並位於當前工作目錄中,可以在編譯器中直接運行該文件,或者通過cmd,執行如下命令:

 locust --host=https://www.cnblogs.com 

2、如果Locust文件位於子目錄下且名稱不是locustfile.py,可以使用-f命令啟動上面的示例locust文件:

 locust -f testscript/locusttest.py --host=https://www.cnblogs.com 

3、如果要運行分布在多個進程中的Locust,通過指定-master以下內容來啟動主進程 :

 locust -f testscript/locusttest.py --master --host=https://www.cnblogs.com 

4、如果要啟動任意數量的從屬進程,可以通過-salve命令來啟動locust文件:

 locust -f testscript/locusttest.py --salve --host=https://www.cnblogs.com 

5、如果要運行分布式Locust,必須在啟動從機時指定主機(運行分布在單台機器上的Locust時不需要這樣做,因為主機默認為127.0.0.1):

 locust -f testscript/locusttest.py --slave --master-host=192.168.0.100 --host=https://cnblogs.com 

6、啟動locust文件成功后,編譯器控制台會顯示如下信息:

 [2018-10-09 01:01:44,727] IMYalost/INFO/locust.main: Starting web monitor at *:8089

[2018-10-09 01:01:44,729] IMYalost/INFO/locust.main: Starting Locust 0.8 

PS:8089是該服務啟動的端口號,如果是本地啟動,可以直接在瀏覽器輸入http://localhost:8089打開UI界面,如果是其他機器搭建locust服務,則輸入該機器的IP+端口即可;

五、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;

 

*************************************************************************locust命令中文說明*********************************************************************************************************************************

 

參數中文說明
參數名稱 參數值 參數說明
-h, --help 不帶參數 查看幫助信息
-H HOST, –host=HOST HOST 指定被測試的主機,采用以格式:http://10.21.32.33
–web-host=WEB_HOST WEB_HOST 指定運行 Locust Web 頁面的主機,默認為空 “。
-P PORT, –port=PORT, –web-port=PORT PORT 指定 –web-host 的端口,默認是8089
-f LOCUSTFILE, –locustfile=LOCUSTFILE LOCUSTFILE 指定運行 Locust 性能測試文件,默認為: locustfile.py
–csv=CSVFILEBASE, –csv-base-name=CSVFILEBASE CSVFILEBASE 以CSV格式存儲當前請求測試數據。
–master 不帶參數 Locust 分布式模式使用,當前節點為 master 節點。
–slave 不帶參數 Locust 分布式模式使用,當前節點為 slave 節點。
–master-host=MASTER_HOST MASTER_HOST 分布式模式運行,設置 master 節點的主機或 IP 地址,只在與 –slave 節點一起運行時使用,默認為:127.0.0.1.
–master-port=MASTER_PORT MASTER_PORT 分布式模式運行, 設置 master 節點的端口號,只在與 –slave 節點一起運行時使用,默認為:5557。注意,slave 節點也將連接到這個端口+1 上的 master 節點。
–master-bind-host=MASTER_BIND_HOST MASTER_BIND_HOST 做分布式壓測時,指定分機IP。只用於master。如果沒有指定,默認是所有可用的IP(即所有標記主機IP的slave)
–master-bind-port=MASTER_BIND_PORT MASTER_BIND_PORT 做分布式壓測時,指定分機port。默認是5557與5558。
–no-web no-web -c 和 -r 配合 模式運行測試,需要 -c 和 -r 配合使用.
-c NUM_CLIENTS, –clients=NUM_CLIENTS NUM_CLIENTS 指定並發用戶數,作用於 –no-web 模式。
-r HATCH_RATE, –hatch-rate=HATCH_RATE HATCH_RATE 指定每秒啟動的用戶數,作用於 –no-web 模式。
-t RUN_TIME, –run-time=RUN_TIME RUN_TIME 設置運行時間, 例如: (300s, 20m, 3h, 1h30m). 作用於 –no-web 模式。
-L LOGLEVEL, –loglevel=LOGLEVEL LOGLEVEL 選擇 log 級別(DEBUG/INFO/WARNING/ERROR/CRITICAL). 默認是 INFO.
–logfile=LOGFILE LOGFILE 日志文件路徑。如果沒有設置,日志將去 stdout/stderr
–print-stats 不帶參數 在控制台中打印數據
–only-summary 不帶參數 只打印摘要統計
–no-reset-stats 不帶參數 Do not reset statistics once hatching has been completed。
-l, –list 不帶參數 顯示測試類, 配置 -f 參數使用
–show-task-ratio 不帶參數 打印 locust 測試類的任務執行比例,配合 -f 參數使用.
–show-task-ratio-json 不帶參數 以 json 格式打印 locust 測試類的任務執行比例,配合 -f 參數使用.
-V, –version 不帶參數 查看當前 Locust 工具的版本.

————————————————
版權聲明:本文為CSDN博主「全棧測試開發日記」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/liudinglong1989/article/details/106991650/

轉載:https://www.cnblogs.com/huahuage/p/12917114.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM