若是Locust類表明了一窩蜜蜂,那麼TaskSet類能夠比做蜜蜂的頭腦。每一個Locust類都有一個對應TaskSet的task_set屬性集html
TaskSet是任務的集合。這些任務能夠被python正常調用-若是在對一個拍賣網站作負載測試-能夠作些任務「加載啓動頁」,「搜索一些產品」,「投標」。python
當負載測試開始後,由Locust類產出的每一個實例將會開始執行它們的TaskSet。接下來每一個TaskSet會選取其中的一個task而且調用它。在Locust類的min_wait 和max_wait的範圍內隨機選取一個值做爲等待時間(除非min_wait/max_wait已經在TaskSet中被定義,這樣就會使用TaskSet中的值)。而後它會選取調用一個新的task,而後等待,如此往復。api
爲一個TaskSet聲明任務的典型方式是使用task裝飾器
函數
這是個例子:測試
from locust import Locust, TaskSet, task class MyTaskSet(TaskSet): @task def my_task(self): print "Locust instance (%r) executing my_task" % (self.locust) class MyLocust(Locust): task_set = MyTaskSet
@task 使用了可選的權重語句被用來定義任務的執行比率。在下面的例子中task2執行次數是task1的兩倍:網站
from locust import Locust, TaskSet, task class MyTaskSet(TaskSet): min_wait = 5000 max_wait = 15000 @task(3) def task1(self): pass @task(6) def task2(self): pass class MyLocust(Locust): task_set = MyTaskSet
使用task屬性來聲明任務是比較方便的,一般來講這個是最好的方式。可是,也能夠經過設置tasks屬性來定義TaskSet下的不一樣任務(使用@task裝飾器實際上只是提供了tasks屬性的參數輸入)。
spa
tasks屬性能夠是可供python調用的列表,或者可調用的<可調用的:整型>字典。任務能夠用來接受參數而且可被python調用-用來執行task的TaskSet類的實例。這裏又個很是簡單的例子(這個文件不會進行任何負載測試)code
from locust import Locust, TaskSet def my_task(l): pass class MyTaskSet(TaskSet): tasks = [my_task] class MyLocust(Locust): task_set = MyTaskSet
若是tasks屬性被定義爲一個列表,那麼每次執行任務的時候,列表項會被隨機選取做爲tasks屬性。若是tasks是個字典-可被調用的鍵名和整數做爲值-那麼將隨機選取任務進行執行,被選取的機率由任務鍵所對應的值決定。以下:htm
{my_task: 3, another_task:1}
my_task 相對 another_task的執行機率 是3:1.ci
TaskSets的一個很是重要的屬性是它們能夠被嵌套,由於真實的網站一般被劃分爲多個小單位而且以分級的方式創建。所以嵌套的TaskSets容許咱們以更加真實的方式定義虛擬用戶的行爲。例如咱們以以下的結構定義TaskSets:
- Index page
- Forum page
- Read thread
- Reply
- New thread
- View next page
- Browse categories
- Watch movie
- Filter movies
- About page
嵌套TaskSets的方式就像使用tasks屬性去定義一個任務,可是它不是調用一個python函數而是指向了另一個TaskSet
class ForumPage(TaskSet): @task(20) def read_thread(self): pass @task(1) def new_thread(self): pass @task(5) def stop(self): self.interrupt() class UserBehaviour(TaskSet): tasks = {ForumPage:10} @task def index(self): pass
在上面的例子中,當UserBehaviour的TaskSet在執行過程當中ForumPage被選中執行的話,而後ForumPage的TaskSet就會執行。接下來ForumPage的TaskSet從它的任務中選擇一個執行,而後等待,如此往復。
上面例子中須要注意的一點是對ForumPage的stop方法中self.interrupt()的調用。它的做用是中止執行ForumPage的任務集,而繼續執行UserBehavior的實例。若是在ForumPage中沒有引用 interrupt()方法,Locust一旦開始了ForumPage任務就永遠不會停下。可是有了interrrupt函數,咱們就能夠經過和任務權重的綁定來定義虛擬用戶離開forum的機率。
也能夠經過@task裝飾器件聲明一個嵌套的TaskSet,將它內嵌在一個類中,就像聲明通常的task同樣:
class MyTaskSet(TaskSet): @task class SubTaskSet(TaskSet): @task def my_task(self): pass
TaskSet類能夠有選擇地聲明一個on_start函數。這樣,當一個虛擬用戶開始執行TaskSet類的時候就能夠調用它。
一個TaskSet實例的locust屬性指向了它的Locust實例,而且parent屬性指向它的父類TaskSet(它會指向在基類TaskSet中的Locust實例)。