前言
在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
裝飾器標記任務,您可以對使用在命令行中使用--tags
and--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