1. 程式人生 > 其它 >locust工具學習筆記(一)

locust工具學習筆記(一)

技術標籤:效能測試軟體測試locust

編寫locustfile檔案

一份locustfile中,宣告至少一個從該類繼承的使用者類

User class(使用者類)

一個使用者類別代表一個使用者。locust將為每個正在模擬的使用者生成User類的一個例項。User類可以定義一些公共屬性。

公共屬性

wait_time屬性

可選屬性,用於模擬使用者在執行任務之間等待指定的時間。

  • constant在固定時間內

  • between在最大值和最小值之間的隨機時間

  • constant_pacing自適應時間,以確保任務每X秒執行一次

from locust import User, task, between, constant, constant_pacing
​
class MyUser(User):
  @task
  def my_task(self):
    print("執行使用者任務!")
​
  # wait_time = between(0.5, 10)  #每個使用者在每次任務執行之間等待0.5到10秒
  # wait_time = constant(1)    #每個使用者每次任務執行之間等待1秒
  wait_time = constant_pacing(1) #每個使用者在1秒內執行1次

自定義wait_time

class MyUser(Use r):
  '''
   User類將休眠一秒鐘,然後休眠兩個,然後休眠三個,依此類推
   '''
  last_wait_time = 0
  def wait_time(self):
    self.last_wait_time += 1
    return self.last_wait_time

weight屬性

用來設定啟動的模擬特定型別的使用者比例,則可以在這些類上設定一個weight屬性

class WebUser(User):
  weight = 3
  #...
class MobileUser(User):
  weight = 1
  #...

host屬性

host屬性是要載入的主機的URL字首 ,可以在locustfile中指定host,若啟動時沒有指定就預設使用該設定。

environment屬性

對使用者正在執行的環境的引用。使用它與環境或它所包含的執行器互動。例如,從一個任務方法中停止runner

self.environment.runner.quit()

如果在獨立locust例項上執行,則將停止整個執行。如果在工作程式節點上執行,它將停止該特定節點。

on_start和on_stop方法

使用者(TaskSets)可以宣告一個on_start方法和/或on_stop方法。使用者將on_start在開始執行時呼叫其方法,並on_stop

在停止執行時呼叫其方法。

對於TaskSet,當模擬使用者開始執行該TaskSet時呼叫on_start方法,當模擬使用者停止執行該TaskSet時呼叫on_stop方法(當interrupt()被呼叫時,或者使用者被殺死時)。

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

每次啟動locust時執行setup方法,退出時執行teardown方法,locust執行TaskSet時執行TaskSet的setup方法,退出時執行teardown方法,每個虛擬使用者執行操作時執行on_start方法,退出時執行on_stop方法

from locust import HttpLocust, TaskSet, task
 
class MyUserBehavior(TaskSet):
  def setup(self):
    print('task setup 每個任務開始前執行')
 
  def teardown(self):
    print('task teardown 每個任務結束前執行')
 
  def on_start(self):
    # 虛擬使用者啟動Task時執行
    print('start 虛擬使用者啟動Task時執行')
 
  def on_stop(self):
    # 虛擬使用者結束Task時執行
    print('end 虛擬使用者結束Task時執行')
 
  @task(2)
  def index(self):
    self.client.get("/")
 
  @task(1)
  def profile(self):
    self.client.get("/index")
 
 
class WebsiteUser(HttpLocust):
  def setup(self):
    print('setup 開始測試前執行')
 
  def teardown(self):
    print('teardown 測試結束後執行')
  task_set = MyUserBehavior
  min_wait = 5000
  max_wait = 9000
#執行順序
setup 開始測試前執行
​
task setup 每個任務開始前執行
​
on_start 虛擬使用者啟動Task時執行
​
tasks 使用者任務
​
on_stop end 虛擬使用者結束Task時執行
​
task teardown 每個任務結束前執行
​
teardown 測試結束後執行

tasks(任務)

當啟動負載測試時,將為每個模擬使用者建立一個User類的例項,它們將開始在自己的綠色執行緒中執行。當這些使用者執行時,他們選擇要執行的任務,休眠一段時間,然後選擇一個新任務,等等。

@task裝飾器

使用@task裝飾器為使用者新增任務,@task可選指定引數,該引數用於指定任務的執行率。

from locust import User, task
​
class MyUser(User):
  @task(1)
  def user_task1(self):
    pass
  
  @task(5)
  def user_task2(self):
    pass
# user_task2任務執行機率是user_task1的5倍  

task屬性

定義使用者任務的另一種方法是設定tasks屬性

  • task屬性指定為列表,則每次執行任務時,都會從task屬性中隨機選擇

  • ask屬性指定為字典,則每次執行任務時,按照字典值比例執行任務

from locust import User, constant
​
def my_task0(user):
  pass
def my_task1(user):
  pass
class MyUser(User):
  tasks = [my_task0,my_task1] 
  #tasks = {my_task0:1,my_task1:2}  執行不力是1:2
  

@tag裝飾器

使用@tag裝飾器標記任務後,使用--tags--exclude-tags引數控制需要執行的任務

from locust import User, constant, task, tag
​
class MyUser(User):
  @tag('tag0')
  @task
  def my_task0(self):
    pass
  @tag('tag0', 'tag1')
  @task
  def my_task1(self):
    pass
  @tag('tag2')
  @task
  def my_task2(self):
    pass

啟動測試時若指定引數--tags tag0,則測試只會執行my_task0,my_task1任務,若指定--tags tag2,則測試只會執行my_task2任務。

引數--exclude-tags與--tags引數作用相反

歡迎大家關注我的訂閱號,會定期分享一些關於測試相關的文章,有問題也歡迎一起討論學習!訂閱號每一條留言都會回覆!