Locust 官方文檔 2: 快速開始

安裝

一般直接通過 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_starton_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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容