1-6 萬 Star!微軟谷歌都在用 Python 性能測試工具

Locust 是一款 Python 技術棧的開源的性能測試工具。Locust 直譯爲蝗蟲,寓意着它能產生蝗蟲般成千上萬的併發用戶。

Locust 並不小衆,從它 Github 的 Star 數量就可見一斑:

鏈接:https://github.com/locustio/locust

截止文章寫作時,一共 15951Star。

Locust 生態良好,它已在多家外企(包括世界 500 強)投入使用:

如此看來,Locust 是非常值得學習和掌握的一款工具。

Python 的魔力在於化繁爲簡,基於 Python 的 Locust 也能給仍然困惑於性能測試的我們帶來啓發。

Locust 特點

安裝 Locust

需要 Python 版本 3.6 及以上。

執行 pip 命令:

$ pip install locust

驗證安裝成功:

$ locust -V

安裝時會一併安裝依賴庫:

Installing collected packages: Werkzeug, pywin32, zope.event, greenlet, gevent, geventhttpclient, itsdangerous, flask, Flask-BasicAuth, ConfigArgParse, pyzmq, psutil, locust

能看出來 flask 爲 Locust 提供了 Web 功能。

快速上手

使用 Locust 一般按照以下步驟進行:

  1. 編寫 Python 用戶腳本。

  2. 使用locust命令執行性能測試。

  3. (可選)通過 Web 界面監測結果。

示例代碼如下,新建 locustfile.py 文件:

import time
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 2.5)

    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    @task(3)
    def view_items(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}")
            time.sleep(1)

    def on_start(self):
        self.client.post("/login"json={"username":"foo""password":"bar"})

路徑切換到 locustfile.py 文件所在目錄,執行命令:

$ locust

也可以通過-f指定某個目錄文件:

$ locust -f locust_files/my_locust_file.py

運行後,打開 http://127.0.0.1:8089 看到 Web 界面:

填寫信息後,就能開始壓測了。Web 界面提供了結果統計數據:

和性能指標走勢圖:

腳本解析

示例腳本解析如下:

# Locust用戶腳本就是Python模塊
import time
from locust import HttpUser, task, between

# 類繼承自HttpUser
class QuickstartUser(HttpUser):
    # 每個模擬用戶等待1~2.5秒
    wait_time = between(1, 2.5)

    # 被@task裝飾的纔會併發執行
    @task
    def hello_world(self):
        # client屬性是HttpSession實例,用來發送HTTP請求
        self.client.get("/hello")
        self.client.get("/world")

    # 每個類只會有一個task被選中執行
    # 3代表weight權重
    # 權重越大越容易被選中執行
    # view_items比hello_wolrd多3倍概率被選中執行
    @task(3)
    def view_items(self):
        for item_id in range(10):
            # name參數作用是把統計結果按同一名稱進行分組
            # 這裏防止URL參數不同會產生10個不同記錄不便於觀察
            # 把10個彙總成1個"/item"記錄
            self.client.get(f"/item?id={item_id}")
            time.sleep(1)

    # 每個模擬用戶開始運行時都會執行
    def on_start(self):
        self.client.post("/login"json={"username":"foo""password":"bar"})

小結

本文先了解了 Locust 的背景和生態,它是值得學習的,對於 Python 技術棧來說更加如此。接着介紹了使用 pip 命令安裝 Locust,其中發現順帶安裝了 flask,Locust 的 Web 功能是 flask 提供的

然後給出了一段示例代碼,按照步驟上手 Locust。最後對示例代碼進行了解析,淺嘗輒止。locustfile 實際上該怎麼寫呢?

參考資料:

https://locust.io/

https://docs.locust.io/en/stable/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/8xlMu2ZzLMAZtb4S3Qch0A