1. 程式人生 > >(七)Locust 的類和方法

(七)Locust 的類和方法

AD IT 任務 HA one user avg page def

針對你的業務,你如何進行測試測試,需要通過編寫性能測試腳本實現。所以,我們要熟悉 Locust 提供了哪些類和方法,它們分別實現什麽操作。

HttpLocust 類


from locust import HttpLocust, TaskSet, task

class UserTask(TaskSet):

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

class UserOne(HttpLocust):
    task_set = UserTask
    weight = 1
    min_wait = 1000
    max_wait = 3000
    stop_timeout = 5
    host = "https://www.baidu.com"

class UserTwo(HttpLocust):
    weight = 2
    task_set = UserTask
    host = "https://www.baidu.com"

每一個模擬的用戶可以看做一個 HttpLocust 類的實例,HttpLocust 類有如下屬性:

  • task_set

指向一個 TaskSet 類,TaskSet 類定義了每個用戶的行為。

  • min_wait

用戶執行任務之間等待時間的下界,單位:毫秒。如果TaskSet類中有覆蓋,以TaskSet 中的定義為準。

  • max_wait

用戶執行任務之間等待時間的上界,單位:毫秒。如果TaskSet類中有覆蓋,以TaskSet中的定義為準。

  • host

如果是 Web 服務的測試,host 相當於是提供 URL 前綴的默認值,但是如果在命令行中指定了 --host 選項,則以命令行中指定的為準。如果不是 Web 服務測試,使用默認的 None 就好。

  • stop_timeout

設置 Locust 多少秒後超時,如果為 None ,則不會超時。

  • weight

一個Locust實例被挑選執行的權重,數值越大,執行頻率越高。在一個 locustfile.py 文件中可以同時定義多個 HttpLocust 子類,然後分配他們的執行權重,例如:

然後在終端啟動測試:

> locust -f load_test.py UserOne UserTwo

TaskSet 類


TaskSet類定義了每個用戶的任務集合,測試任務開始後,每個 Locust 用戶會從 TaskSet 中隨機挑選一個任務執行,然後隨機等待 HttpLocust 類中定義的 min_wait和 max_wait 之間的一段時間,執行下一個任務。

from locust import HttpLocust, TaskSet, task


class stay(TaskSet):

    def on_start(self):
        """ on_start is called when a Locust start before any task is scheduled """
        print("start test")

    @task(3)
    def readBook(self):
        print(‘I am reading a book.‘)

    @task(7)
    def listenMusic(self):
        print(‘I am listening to music.‘)

    @task(1)
    def logOut(self):
        self.interrupt()


class UserTask(TaskSet):
    tasks = {stay:2}

    @task(1)
    def leave(self):
        print(‘I don not like this page.‘)


class User(HttpLocust):
    task_set = UserTask
    host = "https://www.baidu.com"

  • on_start():

定義每個 Locust 用戶開始做的第一件事。

  • @task

通過@task()裝飾的方法為一個事務。方法的參數用於指定該行為的執行權重。參數越大每次被虛擬用戶執行的概率越高。如果不設置默認為1。

  • interrupt(reschedule=True)

頂層的TaskSet(即被綁定到某個Locust類的task_set的第一層TaskSet)不能調用這個方法。reschedule置為True時,從被嵌套任務出來馬上選擇新任務執行,如果置為False,從被嵌套任務出來後,隨機等待min_wait和max_wait之間的一段時間,再選擇新任務執行。

  • tasks 屬性

tasks = {stay:2} 表示每個用戶執行 stay 的頻率是2,也就的 UserTask 的兩倍。

然後在終端啟動測試:

> locust -f tc_load_test2.py --no-web -c 10 -r 10 -t 10s

[2017-10-31 16:41:45,920] DESKTOP-SMGQBBM/INFO/locust.main: Run time limit set to 10 seconds
[2017-10-31 16:41:45,923] DESKTOP-SMGQBBM/INFO/locust.main: Starting Locust 0.8
[2017-10-31 16:41:45,923] DESKTOP-SMGQBBM/INFO/locust.runners: Hatching and swarming 10 clients at the rate 10 clients/s...
 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              0     0(0.00%)                                       0.00

[2017-10-31 16:41:45,924] DESKTOP-SMGQBBM/INFO/stdout: I don not like this page.
[2017-10-31 16:41:45,924] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,023] DESKTOP-SMGQBBM/INFO/stdout: start test
[2017-10-31 16:41:46,023] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,025] DESKTOP-SMGQBBM/INFO/stdout: I am listening to music.
[2017-10-31 16:41:46,025] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,124] DESKTOP-SMGQBBM/INFO/stdout: start test
[2017-10-31 16:41:46,125] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,125] DESKTOP-SMGQBBM/INFO/stdout: I am reading a book.
[2017-10-31 16:41:46,127] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,226] DESKTOP-SMGQBBM/INFO/stdout: start test
[2017-10-31 16:41:46,229] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,230] DESKTOP-SMGQBBM/INFO/stdout: I am reading a book.
[2017-10-31 16:41:46,232] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,325] DESKTOP-SMGQBBM/INFO/stdout: I don not like this page.
[2017-10-31 16:41:46,328] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,424] DESKTOP-SMGQBBM/INFO/stdout: I don not like this page.
[2017-10-31 16:41:46,424] DESKTOP-SMGQBBM/INFO/stdout:
[2017-10-31 16:41:46,525] DESKTOP-SMGQBBM/INFO/stdout: I don not like this page.

...

在這個例子中雖然指定的 host ,但我們並沒有調用 client() 方法發送http 請求。只是在 TaskSet 類方法中簡單做了簡單的打印,通過後臺的輸出,你可以看到每個方法被調用的頻率。

(七)Locust 的類和方法