腳本基本構成
一個 Locust 測試腳本就是一個普通的 python 文件,它的基本組成十分簡單:
-
定義用戶的類型
所有用戶的屬性都需要繼承自 User Class,我們最常用的 HttpUser 也是如此,你也可以定義一個如 TcpUser,或者 WebSocketUser,甚至基於你測試的業務系統來做一個,例如 QQUser,但是最終都必須繼承至 User Class,類似於過去 LoadRunner、Jmeter 的選擇應用的通訊協議或選擇請求插件 -
等待時間的方法
聲明一個等待時間的方法,用於確定模擬用戶在任務之間執行的等待停留時間。Locust 附帶了一些內置函數用於返回等待時間的方法,包括:1、between:在指定范圍內的隨機;2、constant:基於響應到下一次請求之間的固定的等待時間;3、constant_pacing:基於請求到下一次請求的固定間隔時間 -
主機屬性
用於定義測試的主機信息,比如 http://www.cnblogs.com,如果在腳本中沒有定義,那在命令行啟動測試或 WebUI 中將作出定義 -
任務屬性
用於定義任務的執行邏輯,你可以定義多個任務,讓模擬的用戶按照不同任務的權重配置隨機執行,也可以讓任務按照你的編排順序執行
腳本開發入門
我們采用循序漸進的方式來,你不需要特別關注下面的每個范例所具備的實際意義,只需要關心腳本的結構
1、先按照最基本的腳本結構寫一個范例
from locust import user, task, between
class MyUser(User):
@task
def my_task(self):
print("executing my_task")
wait_time = between(5, 15)
腳本實現:
- 定義一個 class,命名為 MyUser,繼承自 user
- 定義了一個 my_task 函數,任務就是 print 一句話
- 通過 @task,定義了 my_task 這個函數將被執行
- 定義了每次任務結束以后,隨機等待時間的間隔區間為5~15秒,再執行下一次任務迭代
把它保存為 locustfile.py,然后執行
locust -f locustfile.py
然后在本地瀏覽器訪問 http://localhost:8089/,在“Start new Locust run”頁面
- Number of total users to simulate 中輸入你需要模擬的用戶總數
- Hatch rate (users spawned/second) 中輸入每秒創建的用戶數
- Host (e.g. http://www.example.com) 中輸入Host站點信息(在本節范例里面隨意輸入即可,如:http://127.0.0.1)
點擊“Start swarming”,可以命令行中看到返回:
PS E:\study.locust> locust -f .\locustfile.py
[2020-07-06 09:14:01,726] DESKTOP-FOCB2DV/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS wouldnt allow locust to increase it by itself. See https://docs.locust.io/en/stable/installation.html#increasing-maximum-number-of-open-files-limit for more info.
[2020-07-06 09:14:01,726] DESKTOP-FOCB2DV/INFO/locust.main: Starting web interface at http://:8089
[2020-07-06 09:14:01,734] DESKTOP-FOCB2DV/INFO/locust.main: Starting Locust 1.1
[2020-07-06 09:14:11,992] DESKTOP-FOCB2DV/INFO/locust.runners: Hatching and swarming 10 users at the rate 10 users/s (0 users already running)...
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
功能實現:
- 一個 print 語句本地跑着玩
2、把這個腳本修改為訪問我的博客:)
import random
from locust import HttpUser, task, between
class cnblogUser(HttpUser):
wait_time = between(5, 10)
@task(2)
def open_blog(self):
self.client.get("/huanghaopeng/")
@task(1)
def open_links(self):
self.client.get("/huanghaopeng/p/13100305.html")
self.client.get("/huanghaopeng/p/13220749.html")
self.client.get("/huanghaopeng/p/13187807.html")
def on_start(self):
self.client.get("/")
腳本實現:
- 把 User 替換為 HttpUser
- 通過 @task,配置了兩個函數的執行權重分別為 2:1
- 在 open_blog 函數內,任務是模擬用戶打開我的博客首頁路徑(Host + "/huanghaopeng/",即:
https://www.cnblogs.com/huanghaopeng/) - 在 open_links 函數內,任務是模擬用戶依次瀏覽 3 篇博客,注意,在這3篇博客的瀏覽過程中,是沒有時間間隔的
- 定義了每次任務結束以后,隨機等待時間的間隔區間仍然為 5~15 秒
把它保存為 locust_cnblogs.py,然后執行
locust -f locust_cnblogs.py
在 Web UI 中填入模擬用戶數、加載速率、以及博客園的 Host 信息 https://www.cnblogs.com/huanghaopeng/
點擊“Start swarming”,可見:
從上面的運行情況可以發現
- 標注1:作為 on_start 任務的內容,請求主機根目錄只執行了 1 次(# Requests)
- 標注2:open_links 任務內依次訪問 3 篇博文的執行順序是可控的,並且同在一個任務內,次數也是一致
- 權重控制 2:1,實際的執行比例約為 40%:10%,但是隨着場景執行時間越來越長,會越來越趨近於 66.6%:33.3%
現在我們對這個腳本進行一些修改,讓它更像一個真實的用戶訪問行為:
- 任務等待時間:任務之間按照特定的等待時間進行間隔
- 步驟等待時間:在任務內加入步驟之間的時間間隔
- 參數化:文章頁面參數
- 任務:按照順序的方式執行
- 自定義 Locust 發出的 HTTP 請求頭
Locust 腳本開發入門(1)
Locust 腳本開發入門(2)
Locust 腳本開發入門(3)
Locust 腳本開發入門(4): 參數化
返回:教程目錄
本節教程涉腳本