Locust 腳本開發入門(2)


腳本開發入門

現在我們對這個腳本進行一些修改,讓它更像一個真實的用戶訪問行為

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,但是隨着日后博客內容的增刪改,這些博客鏈接可能隨之失效、新增,因此為了讓我們的腳本行為更符合一個真實用戶的訪問行為,現需要腳本在打開我博客的首頁后從首頁的頁面源碼中,解析出文章鏈接進行點擊。所以在下面的腳本中,我將會:

  1. 導入 re,在 open_blog 任務中對博客的頁面html源碼進行解析,獲得文章列表的url
  2. 在 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): 參數化
返回:教程目錄
本節教程涉腳本


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM