天天看點

Python Locust性能測試架構實踐

[本文出自天外歸雲的部落格園]

Locust是一個python的性能測試工具,你可以通過寫python腳本的方式來對web接口進行負載測試。

首先你要安裝python2.6以上版本,而且有pip工具。之後打開指令行,分别安裝locustio和pyzmq(指令如下):

之後我們就可以寫性能測試腳本了。

接下來我們拿兩個接口做一下測試,編寫腳本如下(每一步都有注釋)。我來解釋一下,首先我們要import進來三個類,分别是HttpLocust(用來模拟發請求的類)、TaskSet(顧名思義,任務集)、task(任務類)。額外的,為了友善觀察接口測試的執行結果,我引入了json類用來解析web接口的傳回值。我還引入了subprocess類用來執行一下shell指令,自啟動Locust。這裡有三個類,一個是UserBehavior(名字随便起,但傳入TaskSet參數,說明這是一個包含了任務集的類),裡面on_start函數可有可無,他會先于所有task函數運作。剩下被@task裝飾器裝飾的方法都是任務方法,裡面包含了待請求的接口等資訊,傳入的參數代表了權重,如下所示兩個被@task裝飾的方法分别傳入1和2,這意味着每3個人裡有兩個人會有1個模拟使用者執行list_header方法,2個模拟使用者執行list_goods方法。這個參數你也可以不傳入,那就意味着模拟使用者會随機通路所有被@task裝飾的方法。這裡面我對于每個接口的傳回值都做了一下判斷,首先将傳回的字元串轉成json格式并擷取傳回字段result的值,如果不是100就用Locust自帶的報錯方法列印出錯資訊;另兩個類是HttpLocust類(仍然是名字随便起但傳入參數必須得是HttpLocust),是用來模拟使用者的類,包含了一些模拟使用者資訊,其中task_set變量的值用來指定模拟使用者所對應要完成的TaskSet類中包含的請求,min_wait和max_wait(最小等待時間和最大等待時間用來模拟使用者每兩步操作之間的間隔時間,這裡也就是模拟使用者每執行兩個請求之間所間隔的時間)。對Locust類我們可以指定權重,對weight變量的值進行指定。如下所示,兩個Locust類的權重分别為1和3,這意味着兩個Locust類的模拟使用者人數為1:3的關系。最後我加了一個main函數用來執行shell指令,這個shell指令也可以不再本檔案中執行,如果寫在腳本中的話,直接在指令行中調用該python檔案即可,如果不寫在腳本中(注釋掉最後兩行),則需要在指令行終端裡對Locust項目進行啟動。

對Locust項目的啟動,我們可以在指令行終端中執行以下指令:

這裡的“-f”指定了要執行的python檔案路徑,“--host”指定了模拟使用者請求接口的host名。執行該指令,Locust項目就啟動了。如果遇到下面的錯誤,注意[Errorno 10048]那行,可以看出端口8089被占用導緻Locust項目啟動失敗,這裡我們需要找到對應占用了8089端口的程序并殺掉:

Python Locust性能測試架構實踐

為了檢測占用端口的程序我寫了一個PowerShell小腳本:

運作該腳本,輸入端口号8089我們可以看出python.exe程序占用了該端口号:

Python Locust性能測試架構實踐

然後我們在PowerShell中殺掉該程序,再啟動Locust項目,就成功了(如下):

Python Locust性能測試架構實踐

接下來就可以在浏覽器中通路我們的locust頁面來完成負載測試了,如果不想通過浏覽器來設定完成負載測試,純粹指令行模式也是支援的,輸入以下指令:

接下來負載測試就會自動執行,按“ctrl+c”結束負載測試:

Python Locust性能測試架構實踐

對于指令行中的參數的解釋:--no-web是用來選擇無浏覽器模式,-c後面接的是模拟使用者數,-r後面接的每秒模拟使用者并發數,-n後面接的是模拟請求數。

在浏覽器中輸入“http://localhost:8089/”通路,會看到如下頁面:

Python Locust性能測試架構實踐

這裡我們按提示輸入要模拟的使用者總數和每秒鐘并發的使用者數量,點選“Start swarming”就可以運作負載測試了:

Python Locust性能測試架構實踐

點選“STOP”按鈕停止負載測試,現在STATUS為“STOPPED”,點選“New test”可以進行一個新的測試:

Python Locust性能測試架構實踐