python:教你用幾十行代碼實現系統的性能自動化測試

python:教你用幾十行代碼實現系統的性能自動化測試


前言

在開發中,我們有時會碰到,相同的代碼名明明測試環境沒有問題,上了生產就出現各種“么蛾子”,不是連接超時,就是數據有問題,去檢查代碼也不覺得有問題。然後查看系統監控發現,出問題的時間段,往往系統的cpu使用率、內存佔有率都比較高。如果我們預估上線後, 網站或者接口的訪問量, 提前對接口或者網站做壓力測試,提前評估下可能會出現的情況,結果就不一樣了。

性能測試是通過自動化的測試工具模擬多種正常、峰值以及異常負載條件來對系統的各項性能指標進行測試。負載測試和壓力測試都屬於性能測試,兩者可以結合進行。通過負載測試,確定在各種工作負載下系統的性能,目標是測試當負載逐漸增加時,系統各項性能指標的變化情況。壓力測試是通過確定一個系統的瓶頸或者不能接受的性能點,來獲得系統能提供的最大服務級別的測試。

一、Locust介紹和安裝

Locust 是一個用 Python 編寫的開源的負載測試工具。它允許您針對模擬用戶行為的 Web 應用程序編寫測試,然後按規模運行測試以幫助查找瓶頸或其他性能問題。

安裝:pip install locust

檢查是否安裝成功:locust -help


python:教你用幾十行代碼實現系統的性能自動化測試


二、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


python:教你用幾十行代碼實現系統的性能自動化測試


2、瀏覽器訪問locust:

http://localhost:8089/


python:教你用幾十行代碼實現系統的性能自動化測試


Number of users to simulate 設置併發的總用戶數

Hatch rate (users spawned/second) 設置每秒產生的用戶數

點擊start swmarming開始運行

3、運行結果

統計頁面如下:


python:教你用幾十行代碼實現系統的性能自動化測試


圖表頁面:

每秒請求總數統計


python:教你用幾十行代碼實現系統的性能自動化測試


請求響應的時間統計:


python:教你用幾十行代碼實現系統的性能自動化測試



請求用戶數的統計


python:教你用幾十行代碼實現系統的性能自動化測試


故障統計


python:教你用幾十行代碼實現系統的性能自動化測試


還可以下載統計的結果


python:教你用幾十行代碼實現系統的性能自動化測試


完美!!!!!!!!!!!!!!!!

四、一些擴展

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請求操作都能帶上登錄狀態。

關注公眾號“莫非技術棧”可以免費領取源碼哦~


分享到:


相關文章: