腳本開發入門
現在我們對這個腳本進行一些修改,讓它更像一個真實的用戶訪問行為
1) 任務等待時間:任務之間按照特定的等待時間進行間隔
Locust 的任務之間等待時間控制包括:
方法1:between 類,指定范圍內隨機(5~10秒)等待
wait_time = between(5, 10)
方法2:constant 類,從上一次響應結束后,等待特定時間(3秒),再發起下一次請求
wait_time = constant(3)
方法3:constant_pacing 類,從上一次請求發起后,等待特定時間(3秒),再發起下一次請求,如果上一次請求的響應時間大於指定的時間(3秒),則在響應后立即發起下一次請求
wait_time = constant_pacing(3)
2) 步驟等待時間:在任務內加入步驟之間的時間間隔
方法1:從 time 導入 sleep 類即可
至此,腳本實現如下
from time import sleep
from locust import HttpUser, task, constant
class cnblogUser(HttpUser):
# open_blog和open_links任務之間等待固定的3秒
wait_time = constant(3)
@task(2)
def open_blog(self):
self.client.get("/huanghaopeng/")
@task(1)
def open_links(self):
# 在open_links任務內,上下兩個步驟之間,等待1秒
self.client.get("/huanghaopeng/p/13100305.html")
sleep(1)
self.client.get("/huanghaopeng/p/13220749.html")
sleep(1)
self.client.get("/huanghaopeng/p/13187807.html")
sleep(1)
def on_start(self):
self.client.get("/")
3) 參數化:從頁面解析博客文章 ID
由上面 open_links 任務的內容可知,13100305、13220749、13187807 是文章 ID,但是隨着日后博客內容的增刪改,這些博客鏈接可能隨之失效、新增,因此為了讓我們的腳本行為更符合一個真實用戶的訪問行為,現需要腳本在打開我博客的首頁后從首頁的頁面源碼中,解析出文章鏈接進行點擊。所以在下面的腳本中,我將會:
- 導入 re,在 open_blog 任務中對博客的頁面html源碼進行解析,獲得文章列表的url
- 在 open_links 任務中,對 open_blog 任務解析得出的文章url列表進行遍歷訪問
import re
from time import sleep
from locust import HttpUser, task, constant
class cnblogUser(HttpUser):
wait_time = constant(3)
@task(2)
def open_blog(self):
with self.client.get("/huanghaopeng/") as resp:
if resp.status_code < 300:
pattern = re.compile(r'<div class="c_b_p_desc">\n.*<a href="(.*)" class="c_b_p_desc_readmore">')
self.urlList = pattern.findall(resp.text)
else:
pass
@task(1)
def open_links(self):
# 由於權重配置,無法確保 open_links 任務執行時 self.urlList 包含文章鏈接列表
for url in self.urlList:
self.client.get(url)
def on_start(self):
self.client.get("/")
但是,上面腳本存在一個問題,由於當前任務的執行是依據權重配置執行的,無法確保 open_blog 和 open_links 的先后執行順序。
當然,你也可以把 open_blog 和 open_links 兩個任務內的工作合並為一個任務就可以達到順序執行的目的。
4) 任務控制:按照順序的方式執行(SequentialTaskSet 類)
主要步驟:
- 導入 SequentialTaskSet 類
- 創建一個 任務類,繼承自 SequentialTaskSet,在里面編排好任務執行的順序
- 在 cnblogUser 類內部,通過 tasks 轉載需要執行的任務
import re
from time import sleep
from locust import HttpUser, task, constant, SequentialTaskSet
# 繼承 SequentialTaskSet 的一個任務類,內部編排好任務的執行順序
class TaskCase(SequentialTaskSet):
# 初始化
def on_start(self):
self.client.get("/")
# @task 裝飾器說明下面是一個任務
@task
def open_blog(self):
with self.client.get("/huanghaopeng/") as resp:
if resp.status_code < 300:
pattern = re.compile(r'<div class="c_b_p_desc">\n.*<a href="(.*)" class="c_b_p_desc_readmore">')
self.urlList = pattern.findall(resp.text)
else:
pass
# @task 裝飾器說明下面是一個任務
@task
def open_links(self):
for url in self.urlList:
self.client.get(url)
# 繼承 httpUser
class cnblogUser(HttpUser):
tasks = [TaskCase]
wait_time = constant(3)
至此,任務執行順序將為:on_start -> open_blog -> open_links,執行壓測場景看看

由上面的結果,可以看到,虛擬用戶實現了 打開博客首頁,進入我的博客並解析頁面上的文章鏈接,再逐個訪問,但是,瀏覽多篇文章本質上只是不同的文章id傳參請求,沒有在結果中分別統計的需要,因此我們給請求指定一下name,進行合並統計:
def open_links(self):
for url in self.urlList:
# 對name進行傳參為任務名稱
self.client.get(url,name='open_links')
再次執行,可見多篇文章遍歷訪問的請求響應已經被合並統計

Locust 腳本開發入門(1)
Locust 腳本開發入門(2)
Locust 腳本開發入門(3)
Locust 腳本開發入門(4): 參數化
返回:教程目錄
本節教程涉腳本
