安裝
一般直接通過 pip 就可以安裝:
$ pip install locust
注意:
Locust 1.x 版本與之前的設計有很大的顛覆,所以你看到的很多代碼會與你在網上搜索到的代碼不一致。
如果示例代碼運行不成功,請升級你的 Locust。
快速開始
在 Locust 中,可以使用 Python 代碼定義用戶行為。然后,可以使用locust
命令及其 Web 界面生成大量虛擬用戶并收集虛擬用戶的請求統計信息。
一個 locustfile.py
import random
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
@task
def index_page(self):
self.client.get("/hello") # 這里的地址需要排除 host 部分
self.client.get("/world")
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
def on_start(self):
self.client.post("/login", {"username":"foo", "password":"bar"})
對上面的代碼進行分解:
import random
from locust import HttpUser, task, between
Locust 文件只是普通的 Python 代碼文件,可以手動引入 Locust 相關的庫以及你需要用到的其他第三方庫。
class QuickstartUser(HttpUser):
在這里,我們為要模擬的用戶定義一個類。它繼承自HttpUser
,該屬性為每個用戶提供了一個 client 屬性,該屬性是HttpSession
的一個實例。可用于向負載測試的目標系統發出 HTTP 請求。當測試開始時,Locust 將為它每個虛擬用戶創建一個此類的實例,并且每個虛擬用戶會在自己的 gevent 線程中運行這些實例。
HttpUser 類是 Locust 1.x 版本中用來代替以前的 HttpLocust 類,用來定義虛擬用戶。是 User 類的子類。
wait_time = between(5, 9) # 思考時間
我們的類定義了一個wait_time
函數,它將使模擬用戶在每個任務執行后的 5 ~ 9 秒之間等待。等待時間主要為了模擬用戶在實際使用過程中存在的思考時間,對實際用戶在操作系統過程中來說,他/她不會無時無刻不停的操作系統,而是操作一下暫停思考下一步動作。
有關更多信息,請參見wait_time attribute.
@task
def index_page(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_item(self):
...
通過用 @task
裝飾了兩個方法來聲明了兩項任務,其中一種具有更高的權重(@task(3)
)。只有通過 @task
裝飾的方法才會在 Locust 虛擬用戶運行過程中被調用。
當虛擬用戶運行時,會從兩個任務中選擇一個運行,由于 view_item
的權重為 3,因此在選擇任務時會有三倍的機會選擇 view_item
。虛擬用戶會根據權重調用一個方法來運行,運行后會根據wait_time
定義的等待時間休眠 5~9 秒。待休眠時間結束后,會重新根據權重調用一個新任務來執行,并循環重復。
在測試過程中,只有被
@task
定義的方法才會被調用。當然被定義為任務的方法可以調用你定義的其他方法。
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
在view_item
任務中,我們通過使用查詢參數動態加載 URL,該查詢參數是一個從 1 到 10000 之間隨機選擇的數字。為了避免在 Locust 的統計信息中獲得 10k 個單獨的條目(Locust 會根據 URL 分組統計信息),會使用名稱參數name parameter
將所有這些請求分組到名為/item
的條目下。
注意,只有用
@task
裝飾的方法才會被調用,因此可以在 locustfile.py 的測試類中隨意定義其他的輔助方法,以提升測試場景的復雜和靈活性。
def on_start(self):
此外,我們還聲明了on_start
方法。每個虛擬用戶在啟動時都會調用具有該方法。
有關更多信息,請參見on_start
和on_stop
方法。
on_start() 方法是 hook 函數之一,用來定義在一些特殊事件下觸發的邏輯。 on_start() 方法是在虛擬用戶啟動(啟動事件)時會觸發的方法。
開始執行 Locust
將以上代碼放在當前目錄中名為locustfile.py
的文件中,然后運行:
$ locust
Locust 會默認查找當前目錄下名為
locustfile.py
,如果該文件不在當前文件夾或者你取了其他的名字,就需要加上下面的-f
參數了。
如果你的locustfile.py
位于其他地方,則可以使用-f
參數指定它:
$ locust -f locust_files/my_locust_file.py
注意:要查看所有可用選項,請輸入:
locust --help
或查看Configuration
Locust 的 web 界面
一旦使用上述命令行之一啟動 Locust 后,會在本地開啟一個服務并占用8089
端口,你可以打開瀏覽器并將其指向http://127.0.0.1:8089。
如果
http://127.0.0.1:8089
無法找到,你可以嘗試一下 http://locust:8089。
然后,你會看到如下界面:
請根據表單內容填寫,并嘗試一下。
- Number of total users to simulate -> 最大并發用戶數
- Hatch rate -> 孵化率(每秒生成的虛擬用戶數)
- Host -> 被測系統的 Host(如果你在 User類 中定義了host 屬性,會自動帶出來,如果沒有就需要輸入)
孵化率 Hatch rate,在 Locust 中把生成虛擬用戶這個過程稱之為“孵化”。
更多選項
要運行分布在多個 Python 進程或計算機上的 Locust,可以使用--master
命令行參數啟動單個 Locust 主進程,然后在--worker
命令行參數中使用任意數量的 Locust worker 進程。
更多關于分布式運行的信息,請參閱Locust 分布式運行
要直接開始測試而不使用 Web 界面,請使用--headless
。
也可以通過環境變量設置參數
Parameters can also be set through [environment variables],或寫入配置文件config file。