前言
在開發中,我們有時會碰到,相同的代碼名明明測試環境沒有問題,上了生產就出現各種“么蛾子”,不是連接超時,就是數據有問題,去檢查代碼也不覺得有問題。然後查看系統監控發現,出問題的時間段,往往系統的cpu使用率、內存佔有率都比較高。如果我們預估上線後, 網站或者接口的訪問量, 提前對接口或者網站做壓力測試,提前評估下可能會出現的情況,結果就不一樣了。
性能測試是通過自動化的測試工具模擬多種正常、峰值以及異常負載條件來對系統的各項性能指標進行測試。負載測試和壓力測試都屬於性能測試,兩者可以結合進行。通過負載測試,確定在各種工作負載下系統的性能,目標是測試當負載逐漸增加時,系統各項性能指標的變化情況。壓力測試是通過確定一個系統的瓶頸或者不能接受的性能點,來獲得系統能提供的最大服務級別的測試。
一、Locust介紹和安裝
Locust 是一個用 Python 編寫的開源的負載測試工具。它允許您針對模擬用戶行為的 Web 應用程序編寫測試,然後按規模運行測試以幫助查找瓶頸或其他性能問題。
安裝:pip install locust
檢查是否安裝成功:locust -help
二、Locust的源碼
創建unctionTest.py,編寫源碼
1、創建一個方法WebsiteTasks(TaskSet)並繼承TaskSet
2、編寫啟動執行項on_start(self), 改啟動項只會啟動的時候被執行一次。
3、添加執行的任務@task(5), 方法的參數用於指定該行為的執行權重,參數越大每次被虛擬用戶執行的概率越高,默認為1。
4、創建 WebsiteUser(HttpLocust)繼承HttpLocust, 配置Locust執行的一些配置參數。
源碼如下:
from locust import HttpLocust, TaskSet, taskclass WebsiteTasks(TaskSet):
#進行初始化的工作,每個Locust用戶開始做的第一件事
def on_start(self):
payload = {
"username": "test",
"password": "test01",
}
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
}
self.client.post("/login",data=payload,headers=header)#self.client屬性使用Python request庫的所有方法,調用和使用方法和requests完全一致;
#通過@task()裝飾的方法為一個事務,方法的參數用於指定該行為的執行權重,參數越大每次被虛擬用戶執行的概率越高,默認為1
@task(5)
def index(self):
self.client.get("/")
@task(1)
def about(self):
self.client.get("/about/")
class WebsiteUser(HttpLocust):
#被測系統的host,在終端中啟動locust時沒有指定--host參數時才會用到
host = "https://github.com/"
#TaskSet類,該類定義用戶任務信息,必填。這裡就是:WebsiteTasks類名,因為該類繼承TaskSet;
task_set = WebsiteTasks
#每個用戶執行兩個任務間隔時間的上下限(毫秒),具體數值在上下限中隨機取值,若不指定默認間隔時間固定為1秒
min_wait = 5000
max_wait = 15000
三、開發自動化性能測試
1、執行源碼:
locust -f D:\\javacode\\hk03\\webPageTest\\src\\性能自動化測試\\functionTest.py
2、瀏覽器訪問locust:
http://localhost:8089/
Number of users to simulate 設置併發的總用戶數
Hatch rate (users spawned/second) 設置每秒產生的用戶數
點擊start swmarming開始運行
3、運行結果
統計頁面如下:
圖表頁面:
每秒請求總數統計
請求響應的時間統計:
請求用戶數的統計
故障統計
還可以下載統計的結果
完美!!!!!!!!!!!!!!!!
四、一些擴展
no-web模式運行啟動
終端中-->進入代碼目錄:>> locust -f xxoo.py --no-web -c10 -r2 -t 1m
啟動參數:--no-web 表示不使用web界面運行測試。 -c 設置虛擬用戶數 。 -r 設置每秒啟動虛擬用戶數 。 -t 設置運行時間.。
no-web模式運行將測試結果保存到當前.py目錄中:locust -f xxoo.py --csv=起一個名字
例如:locust -f test3.py --csv=foobar --no-web -c2 -t10s
分佈式壓測:
主從機中必須運行相同的測試代碼(把主機中代碼複製一份到多個從機中),主機負責收集測試數據,從機進行施壓測試;
在主機終端中-->進入代碼目錄:>> locust -f xxxoo.py --master
從機中終端中-->進入代碼目錄:>> locust -f xxxoo.py --slave --master-host=主機ip
分佈式壓測no-web模式保存結果到主機中當前運行.py的目錄中:>>locust -f test2.py --csv=foobartt --no-web -c2 -t10s --master
WebsiteTasks類中如何去調用 WebsiteUser(HttpLocust)類中定義的字段和方法呢?
通過在WebsiteTasks類中self.locust.xxoo xxoo就是我們在WebsiteUser類中定義的字段或方法;
代碼如下
from locust import HttpLocust, TaskSet, task
class WebsiteTasks(TaskSet):
@task(1)
def about(self):
#獲取WebsiteUser定義的參數
user_date = self.locust.user_date
testDate = self.locust.funTest()
self.client.get("/about/")
class WebsiteUser(HttpLocust):
host = "https://github.com/"
task_set = WebsiteTasks
min_wait = 5000
max_wait = 15000
user_date = "testdata"
def funTest(self):
return "哈哈哈,訪問到了"
self.client 的理解
在Locust類中,靜態字段client即客戶端的請求方法,這裡的client字段沒有綁定客戶端請求方法,因此在使用Locust時,需要先繼承Locust類class HttpLocust(Locust),然後在self.client = HttpSession(base_url=self.host)綁定客戶端請求方法;
對於常見的HTTP(s)協議,Locust已經實現了HttpLocust類,其self.client=HttpSession(base_url=self.host),而HttpSession繼承自requests.Session。因此在測試HTTP(s)的Locust腳本中,可以通過client屬性來使用Python requests庫的所 有方法,調用方式與 reqeusts完全一致。另外,由於requests.Session的使用,client的方法調用之間就自動具有了狀態記憶功能。常見的場景就是,在登錄系統後可以維持登錄狀態的Session,從而後續HTTP請求操作都能帶上登錄狀態。
關注公眾號“莫非技術棧”可以免費領取源碼哦~
閱讀更多 一個程序員的獨白 的文章