內容來自網絡
http://blog.sina.com.cn/s/blog_a7ace3d80102w9r0.html
TaskSet類
正如字面意思,TaskSet類定義了每個用戶的任務集合,測試任務開始后,每個Locust用戶會從TaskSet中隨機挑選(如果定義了任務間的權重關系,那么就是按照權重關系隨機挑選)一個任務執行,然后隨機等待Locust類中定義的min_wait和max_wait(如果TaskSet類中也定義了min_wait或者max_wait,按照TaskSet中的為准)之間的一段時間,執行下一個任務。
定義TaskSet中的任務有多種方式,比如使用@task修飾符、使用tasks屬性。
1 from locust import Locust, TaskSet, task 2 3 class UserTask(TaskSet): 4 @task(1) 5 def job1(self): 6 print 'This is job 1' 7 8 @task(2) 9 def job2(self): 10 print 'This is job 2' 11 12 class User(Locust): 13 task_set = UserTask
TaskSet的定義是可以嵌套的,因為考慮到現實中有很多任務其實也是有嵌套結構的,比如:
1 from locust import Locust, TaskSet, task 2 3 class UserTask(TaskSet): 4 @task(2) 5 class stay(TaskSet): 6 @task(3) 7 def readBook(self): 8 print 'I am reading a book.' 9 10 @task(7) 11 def listenMusic(self): 12 print 'I am listening to music.' 13 14 @task(1) 15 def logOut(self): 16 self.interrupt() 17 18 @task(1) 19 def leave(self): 20 print 'I don not like this page.' 21 22 class User(Locust): 23 task_set = UserTask
上面的例子中,要么用戶不喜歡這個網頁直接離開,要么喜歡就留下來,留下來的話,可以選擇看書、聽音樂、或者離開。
在stay這個類中,對interrupt()方法的調用是非常重要的,這可以讓一個用戶跳出stay這個類有機會執行leave這個任務,否則他一旦進入stay任務就會一直在看書或者聽音樂而難以自拔。
除了使用@task修飾符完成嵌套,也可以使用tasks屬性,效果是一樣的:
1 from locust import Locust, TaskSet, task 2 3 class stay(TaskSet): 4 @task(3) 5 def readBook(self): 6 print 'I am reading a book.' 7 8 @task(7) 9 def listenMusic(self): 10 print 'I am listening to music.' 11 12 @task(1) 13 def logOut(self): 14 self.interrupt() 15 16 class UserTask(TaskSet): 17 tasks = {stay:2} 18 19 @task(1) 20 def leave(self): 21 print 'I don not like this page.' 22 23 class User(Locust): 24 task_set = UserTask
TaskSet類還有其他的有用方法:
- on_start()函數
定義每個locust用戶進入TaskSet之后開始做的第一件事。 - locust屬性
指向每個TaskSet所屬的loucst用戶實例。 - parent屬性
指向每個TaskSet所屬的父類TaskSet,用在TaskSet有嵌套的情況,如果調用parent的TaskSet是最頂層的,則返回它所屬的locust用戶實例。 - client屬性
指向TaskSet所屬的父HttpLocust類的client屬性,self.client與self.locust.client效果是一樣的。如果TaskSet所屬的父類是個Locust類,則沒有這個client屬性。 - interrupt(reschedule=True)
頂層的TaskSet(即被綁定到某個Locust類的task_set的第一層TaskSet)不能調用這個方法。reschedule置為True時,從被嵌套任務出來馬上選擇新任務執行,如果置為False,從被嵌套任務出來后,隨機等待min_wait和max_wait之間的一段時間,再選擇新任務執行。 - schedule_task(task_callable, args=None, kwargs=None, first=False)
將一個可調用的對象task_callable添加進Locust對象(注意是針對某個Locust實例,而不是所有的Locust實例)的任務選擇隊列,其中args和kwargs是傳遞給可調用對象的參數,如果first置為True,則將其加到隊首。