用 Locust.io 來做 Load Testing

locust.io

前言

最近同事在尋找 load testing 工具,除了老牌的 JMeter, ab 之外,也有看看像是 vegetak6 等等比較新的 tool。身為一個 Python 使用者,當然是推薦 locust.io 這套 load testing 工具。

Locust 在英文當中是蝗蟲的意思,作者應該是希望用蝗蟲過境的概念來模擬網站被大量流量灌進去的概念。

根據 Locust 官方說明文件,Locust 主要有以下的特色:

  • 用 Python 來寫你要執行 load testing 的 case
  • 可以透過分散式的模式,支援模擬成千上萬的使用者
  • 提供 Web-based 使用者介面
  • 除了 web API 之外,也可以拿來測試其他系統
  • 你可以自己修改程式碼

安裝

因為 locust 是 Python 寫的,要安裝當然是透過

pip install locust

接著可以用

locust -V

來確認安裝好的 locust 版本,確認安裝好之後,我們就可以開始寫 load testing 了。

第一個 Loading Test

安裝好之後,我們接著可以來撰寫我們第一個 loading test。

from locust import HttpUser, task, between

class WebUser(HttpUser):
    wait_time = between(0, 2)

    @task
    def hosts(self):
        self.client.get("/api/hosts", headers={"authorization": self.token})

    @task(2)
    def assets(self):
        self.client.get("/api/tags/assets", headers={"authorization": self.token})

    def on_start(self):
        response = self.client.post(
            "/api/get_token", json={"email": "email", "password": "password"}
        )
        self.token = response.content

首先,為了模擬使用者行為,我們要繼承 HttpUser 這個 class。這個 class 要訂一一個 wait_time 來模擬每個使用者在不同 task 之間會等待數秒的狀況。在這邊,我們透過 wait_time = between(0, 2) 代表使用者在每個動作之間會間隔 0~2 秒。

    def on_start(self):
        response = self.client.post(
            "/api/get_token", json={"email": "email", "password": "password"}
        )
        self.token = response.content

接著,如果在開始 load testing 之前我們必須要做些前置作業,像是登入、或是取得 JWT token 等等,都可以寫在 on_start 這個 method 當中。在這邊我們可以看到我們先往 /api/get_token 這個 url 發出 request,取得 JWT token 之後存在 self.token 當中給後續使用。

    @task
    def hosts(self):
        self.client.get("/api/hosts", headers={"authorization": self.token})

在 locust 當中每一次的使用者行為都稱之為一個 task,會在上面看到用 task decorator 來表示。在此,我們透過 self.client.get 來呼叫 API,其中的 headers 就是透過之前取得的 JWT token 來做認證之用。

    @task(2)
    def assets(self):
        self.client.get("/api/tags/assets", headers={"authorization": self.token})

在這邊,我們可以看到另外一個 task,這邊跟前面不同的是在 task 當中多了一個 2 這個數字。這邊的數字是代表比重,以這個例子來說,hosts 比重是 1(沒有填數字代表 1),assets 比重是 2,因此在執行 load testing 的時候,就會以 1:2 的比例下去執行。

正式執行

將以上檔案存成 locustfile.py 之後,我們可以正式開始做 load testing 了。在 command line 底下,執行

locust

接著訪問 http://127.0.0.1:8089 就可以看到如下的介面

這邊可以看到有三個參數:

  • Number of total users to simulate: 要模擬最多少個 user 上線
  • Spawn rate: 每秒鐘會產生多少個 user
  • Host: 要做 load testing 的目標服務器

點擊 Start swarming 之後,就會正式開始執行。

這邊可以看到 locust 對每一個 URL 發了多少 request,有多少失敗,以及每隻 API response time 的 Min, Max, average, Median, 90% percentile 等等重要數據。另外,也有簡單的圖表可以讓你更容易用視覺化的方式理解結果。

如果想要把資料抓下來自己處理,也可以選擇最右方的 “Download Data” 欄位,下載 CSV 檔案到 google spreadsheets 等地方做處理。

總結

這篇大概介紹了一下 locust 的用法,基本上看完這篇介紹應該可以滿足平常 80% 以上 load testing 要處理的 case。

跟傳統的 ab、jmeter 等工具比起來,locust 有簡單的 case 撰寫方式,有漂亮的 UI 以及圖表,應該會是個更好的選擇。下次在做 load testing 的時候別忘記了有 locust 這個選項!



Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *