Python 編寫locust性能測試代碼


 

 

前言

在Locust測試腳本中,所有業務測試場景都是在HttpLocust和TaskSet兩個類的繼承子類中進行描述;

from locust import HttpLocust, TaskSet, task

# 定義用戶行為
class UserBehavior(TaskSet):

    @task
    def baidu_index(self):
        self.client.get("/")


class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 3000
    max_wait = 6000

通過命令行啟動

locust -f .\load_test.py --host=https://www.baidu.com
  • f 指定性能測試腳本文件。
  • --host 指定被測試應用的URL的地址,注意訪問百度使用的HTTPS協議。

然后通過瀏覽器訪問,並設置測試參數:http://localhost:8089(Locust啟動網絡監控器,默認為端口號為: 8089)

TaskSet類

一個TaskSet類定義了一個用戶操作行為的任務集合,測試任務開始后,任務可以順序執行(schedule_task)、挑選下一個任務(execute_next_task)、執行任務(execute_task)、休眠等待(wait)、中斷控制(interrupt)等待。

這樣就可以模擬用戶的業務測試場景,對虛擬用戶的所有行為進行組織和描述,並可以對不同任務的權重進行配置,一個TaskSet類重要的屬性有哪些?

wait_time屬性
用戶wait_time方法是一種可選功能,用於使模擬用戶在任務執行之間等待指定的時間。
內置了三個等待時間功能:

  • constant 在固定的時間內;
  • between 在最大值和最小值之間的隨機時間;
  • constant_pacing 自適應時間,以確保任務每X秒(最多)運行一次。

例如,使每個用戶在每次任務執行之間等待0.5到10秒:

from locust import TaskSet, task, between

class MyUser(TaskSet):
    @task
    def my_task(TaskSet):
        print("executing my_task")

    wait_time = between(0.5, 10)

也可以在類上直接聲明自己的wait_time方法。例如,下面的TaskSet類將休眠一秒鍾,然后休眠兩秒,然后休眠三秒,依此類推。

class MyUser(TaskSet):
    last_wait_time = 0

    def wait_time(self):
        self.last_wait_time += 1
        return self.last_wait_time

    ...

用戶任務屬性

有兩種方式定義任務(用戶行為)
@task裝飾器
使用task裝飾器為用戶添加任務
且@task采用可選的weight參數,該參數可用於指定任務的執行率。在以下示例中,task2被選擇為task1的機會是兩倍:

from locust import TaskSet, task

class UserBehavior(TaskSet):
    @task(1)
    def test_job1(self):
        self.client.get('/test1')

    @task(3)
    def test_job2(self):
        self.client.get('/test2')

采用task屬性

from locust import TaskSet

def test_job1(obj):
    obj.client.get('/test1')

def test_job2(obj):
    obj.client.get('/test2')

class UserBehavior(TaskSet):
    tasks = {test_job1: 1, test_job2: 2}
    # tasks = [(test_job1,1), (test_job1,3)] # 兩種方式等價

上面兩種定義任務信息方式中,均設置了權重屬性,即執行test_job2的頻率是test_job1的兩倍。若不指定,默認比例為1:1。

不同用戶權重屬性
如果測試文件中存在多個用戶類,也就是有多個用戶在操作,可以讓一個用戶有更多操作的機會,比如以這里為例來說,網絡用戶的可能性是移動用戶的三倍:

class WebUser(TaskSet):
weight = 3
...

class MobileUser(TaskSet):
weight = 1
...

任務標簽

通過使用@tag裝飾器標記任務,您可以對使用在命令行中使用--tagsand--exclude-tags參數指定任務執行,而其他任務跳過考慮以下示例:

from locust import TaskSet, constant, task, tag

class MyUser(TaskSet):
    wait_time = constant(1)

    @tag('tag1')
    @task
    def task1(self):
        pass

    @tag('tag1', 'tag2')
    @task
    def task2(self):
        pass

    @tag('tag3')
    @task
    def task3(self):
        pass

    @task
    def task4(self):
        pass

如果--tags tag1,那么只有task1任務和task2執行;

如果--tags tag2 tag3,那么只有task2任務和task3執行。

注意:可以為一個任務打上多個tag。

 

編寫接口壓測腳本文件locustfile.py

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def setup(self):
        print('task setup')

    def teardown(self):
        print('task teardown')

    def on_start(self):
        # 虛擬用戶啟動Task時運行
        print('start')

    def on_stop(self):
        # 虛擬用戶結束Task時運行
        print('end')

    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def profile(self):
        self.client.get("/profile")

class WebsiteUser(HttpLocust):
    def setup(self):
        print('locust setup')

    def teardown(self):
        print('locust teardown')

    host = http: // XXXXX.com
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000

if __name__ == '__main__':
    pass

說明:

Locust類有setup和teardown,TaskSet類有setup、teardown、on_start、on_stop。

每次啟動locust時運行setup方法,退出時運行teardown方法,locust執行TaskSet時運行TaskSet的setup方法,退出時運行teardown方法,每個虛擬用戶執行操作時運行on_start方法,退出時執行on_stop方法,運行上面的腳本,執行順序如下:

執行順序:Locust setup → TaskSet setup → TaskSet on_start → TaskSet tasks → TaskSet on_stop → TaskSet teardown → Locust teardown

創建ScriptTasks()類繼承TaskSet類: 用戶行為類,用於定義測試業務場景。
創建index()、about()、demo()方法分別表示一個行為,訪問http://example.com。用@task() 裝飾該方法為一個任務。1、2表示一個Locust實例被挑選執行的權重,數值越大,執行頻率越高。在當前ScriptTasks()行為下的三個方法得執行比例為2:1:1
WebsiteUser()類: 用於定義模擬用戶。
task_set : 指向一個定義了的用戶行為類。
host: 指定被測試應用的URL的地址
min_wait : 用戶執行任務之間等待時間的下界,單位:毫秒。
max_wait : 用戶執行任務之間等待時間的上界,單位:毫秒。

參考:

https://docs.locust.io/en/stable/writing-a-locustfile.html

https://www.cnblogs.com/monogem/p/10715637.html


免責聲明!

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



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