天天看點

Locust(性能測試)一、Locust 介紹二、Locust安裝三、建立性能測試參考

一、Locust 介紹

Locust 官方網站 :https://www.locust.io/

一個開源性能測試工具。

使用 Python 代碼來定義使用者行為。用它可以模拟百萬計的并發使用者通路你的系統。

性能工具對比

LoadRunner Jmeter Locust
授權方式 商業收費 開源免費 開源免費
開發語言 C/Java Java Python
測試腳本形式 C/Java GUI Python
并發機制 程序/線程 線程 協程
單機并發能力
分布式壓力 支援 支援 支援
資源監控 支援 不支援 不支援
報告與分析 完善 簡單圖表 簡單圖表
支援二次開發 不支援 支援 支援
  1. LoadRunner 是非常有名的商業性能測試工具,功能非常強大。使用也比較複雜,目前大多介紹性能測試的書籍都以該工具為基礎,甚至有些書整本都在介紹 LoadRunner 的使用。
  2. Jmeter 同樣是非常有名的開源性能測試工具,功能也很完善,它可以作為接口測試工具的使用。但實際上,它是一個标準的性能測試工具。關于Jmeter相關的資料也非常豐富,它的官方文檔也很完善。
  3. Locust 同樣是性能測試工具,雖然官方這樣來描述它 “An open source load testing tool.” 。但其它和前面兩個工具有着較大的不同。相比前面兩個工具,功能上要差上不少,但它也并非優點全無。
    • Locust 完全基本 Python 程式設計語言,采用 Pure Python 描述測試腳本,并且 HTTP 請求完全基于 Requests 庫。除了 HTTP/HTTPS 協定,Locust 也可以測試其它協定的系統,隻需要采用Python調用對應的庫進行請求描述即可。
    • LoadRunner 和 Jmeter 這類采用程序和線程的測試工具,都很難在單機上模拟出較高的并發壓力。Locust 的并發機制摒棄了程序和線程,采用協程(gevent)的機制。協程避免了系統級資源排程,由此可以大幅提高單機的并發能力。

二、Locust安裝

  • pip安裝
pip install locust
           
  • 源碼安裝
git clone https://github.com/locustio/locust/
cd locust
python setup.py install
           

三、建立性能測試

3.1 編寫簡單腳本

from locust import HttpLocust, TaskSet, task


# 定義使用者行為
class UserBehavior(TaskSet):

    # 任一測試用例執行前均會執行一次
    def on_start(self):
        print('開始性能測試')

    @task(1)
    # 表示一個使用者為行,通路百度首頁。使用 @ task裝飾該方法為一個事務。client.get()用于指請求的路徑“ / ”,因為是百度首頁,是以指定為根路徑。
    def index(self):
        self.client.get("/")

    @task(2)  # task()參數用于指定該行為的執行權重。參數越大每次被虛拟使用者執行的機率越高。如果不設定預設為1。
    def index2(self):
        self.client.get(
            "/s?wd=locust&rsv_spt=1&rsv_iqid=0xbb8514200006b7d0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=8&rsv_sug1=9&rsv_sug7=101&rsv_sug2=0&inputT=1458&rsv_sug4=1911&rsv_sug=2")


# 用于設定性能測試
class WebsiteUser(HttpLocust):
    # 指向一個定義的使用者行為類。
    task_set = UserBehavior

    # 執行事務之間使用者等待時間的下界(機關:毫秒)。如果TaskSet類中有覆寫,以TaskSet 中的定義為準。
    min_wait = 3000

    # 執行事務之間使用者等待時間的上界(機關:毫秒)。如果TaskSet類中有覆寫,以TaskSet中的定義為準。
    max_wait = 6000

    # 設定 Locust 多少秒後逾時,如果為 None ,則不會逾時。
    stop_timeout = 5

    # 一個Locust執行個體被挑選執行的權重,數值越大,執行頻率越高。在一個 locustfile.py 檔案中可以同時定義多個 HttpLocust 子類,然後配置設定他們的執行權重
    weight = 3

    # 腳本指定host執行測試時則不在需要指定
    host = "https://www.baidu.com"
           

3.2 執行測試

3.2.1 web執行

啟動服務

locust -f test.py --host=https://www.baidu.com
locust -f test.py  # 如果腳本中已經指定host,則不需要再次指定
           

-f 指定性能測試腳本檔案。

–host 指定被測試應用的URL的位址,注意通路百度使用的HTTPS協定。

執行測試

通過浏覽器通路:http://localhost:8089(Locust啟動網絡監控器,預設為端口号為: 8089)

Locust(性能測試)一、Locust 介紹二、Locust安裝三、建立性能測試參考

Number of users to simulate 設定模拟使用者數。

Hatch rate(users spawned/second) 每秒産生(啟動)的虛拟使用者數。

點選 “Start swarming” 按鈕,開始運作性能測試。

Locust(性能測試)一、Locust 介紹二、Locust安裝三、建立性能測試參考

結果說明

  • Type: 請求的類型,例如GET/POST。
  • Name:請求的路徑。這裡為百度首頁,即:https://www.baidu.com/
  • request:目前請求的數量。
  • fails:目前請求失敗的數量。
  • Median:中間值,機關毫秒,一半的伺服器響應時間低于該值,而另一半高于該值。
  • Average:平均值,機關毫秒,所有請求的平均響應時間。
  • Min:請求的最小伺服器響應時間,機關毫秒。
  • Max:請求的最大伺服器響應時間,機關毫秒。
  • Content Size:單個請求的大小,機關位元組。
  • reqs/sec:是每秒鐘請求的個數。

3.2.2 no-web執行

locust -f test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
locust -f test.py --no-web -c 10 -r 2 -t 1m  # 如果腳本中已經指定host,則不需要再次指定
           

–no-web 表示不使用Web界面運作測試。

-c 設定虛拟使用者數。

-r 設定每秒啟動虛拟使用者數。

-t 設定設定運作時間。

關閉服務可直接Ctrl+C

3.3 分布式運作

一旦單台機器不夠模拟足夠多的使用者時,Locust支援運作在多台機器中進行壓力測試。

為了實作這個,你應該在 master 模式中使用–master标記來啟用一個 Locust 執行個體。這個執行個體将會運作你啟動測試的 Locust 互動網站并檢視實時統計資料。master 節點的機器自身不會模拟任何使用者。相反,你必須使用 --slave 标記啟動一台到多台 Locustslave 機器節點,與标記 --master-host 一起使用(指出master機器的IP/hostname)。

常用的做法是在一台獨立的機器中運作master,在slave機器中每個處理器核心運作一個slave執行個體。

注意:master 和每一台 slave 機器,在運作分布式測試時都必須要有 locust 的測試檔案。

在 master 模式下啟動 Locust:
locust -f my_loucstfile.py --master

在每個 slave 中執行(192.168.0.14 替換為你 master 的IP):
locust -f my_locustfile.py --slave --master-host=192.168.0.14
           

參數說明

--master
設定 Locust 為 master 模式。網頁互動會在這台節點機器中運作。
--slave
設定 Locust 為 slave 模式。
--master-host=X.X.X.X
可選項,與 --slave 一起結合使用,用于設定 master 模式下的 master 機器的IP/hostname(預設設定為127.0.0.1)
--master-port=5557
可選項,與 --slave 一起結合使用,用于設定 master 模式下的 master 機器中 Locust 的端口(預設為5557)。注意,locust 将會使用這個指定的端口号,同時指定端口+1的号也會被占用。是以,5557 會被使用,Locust将會使用 5557 和 5558。
--master-bind-host=X.X.X.X`
可選項,與 --master 一起結合使用。決定在 master 模式下将會綁定什麼網絡接口。預設設定為*(所有可用的接口)。
--master-bind-port=5557
可選項,與 --master 一起結合使用。決定哪個網絡端口 master 模式将會監聽。預設設定為 5557。注意 Locust 會使用指定的端口号,同時指定端口+1的号也會被占用。是以,5557 會被使用,Locust 将會使用 5557 和 5558。
--expect-slaves=X
在 no-web 模式下啟動 master 時使用。master 将等待X連接配接節點在測試開始之前連接配接。
           

3.4 權重配置設定

Locust支援同一腳本中使用權重的方式達到用例被執行頻率不同的問題(例如使用者流失,浏覽使用者100人,注冊隻有50人),不同于Jmeter、LandRunner權重配置設定方式并不是标準的比例。

3.4.1 權重1-task

# -*- coding: utf-8 -
from locust import HttpLocust, TaskSet, task

class TestLocust(TaskSet):

    def on_start(self):
        print('開始性能測試')

    @task(1)
    def test_demo_get1(self):
        self.client.get(url="/mock_server/configs/info")
    @task(2)
    def test_demo_get2(self):
        self.client.get("/mock_server/mock/show_lists")


class Query(HttpLocust):
    task_set = TestLocust
    min_wait = 1000
    max_wait = 3000
    host = http://localhost:5000
           

方法的參數用于指定該行為的執行權重。參數越大每次被虛拟使用者執行的機率越高。如果不設定預設為1。

Locust(性能測試)一、Locust 介紹二、Locust安裝三、建立性能測試參考

3.4.2 權重2-weight

# -*- coding: utf-8 -
from locust import HttpLocust, TaskSet, task


class TestLocust(TaskSet):

    def on_start(self):
        print('開始性能測試')

    @task
    def test_demo_get(self):
        self.runLocust(demoGet.demo_get())


class TestLocust2(TaskSet):

    def on_start(self):
        print('開始性能測試')

    @task
    def test_demo_post(self):
        page_num, num = 10, 1
        self.runLocust(demoPost.demo_post(page_num, num))


class QueryOne(HttpLocust):
    task_set = TestLocust
    min_wait = 1000
    max_wait = 3000
    weight = 1
    host = http://localhost:5000


class QueryTwo(HttpLocust):
    task_set = TestLocust2
    min_wait = 1000
    max_wait = 3000
    weight = 3
    host = http://localhost:5000
           

執行語句不同

locust -f test.py QueryOne QueryTwo
           

weight

一個Locust執行個體被挑選執行的權重,數值越大,執行頻率越高。在一個 locustfile.py 檔案中可以同時定義多個 HttpLocust 子類,然後配置設定他們的執行權重。

Locust(性能測試)一、Locust 介紹二、Locust安裝三、建立性能測試參考

3.5 參數化

參數化首先需要清楚locust的執行邏輯。

定義的使用者行為下帶有task裝飾器的函數才會被協程不斷的執行。

from locust import HttpLocust, TaskSet, task
from random import randint

data1 = randint(1, 3)


# 定義使用者行為
class UserBehavior(TaskSet):

    def on_start(self):
        print('開始性能測試')

    @task(1)
    def index(self):
        print(data1)
        self.client.get("/")

    @task(2)
    def index2(self):
        data2 = randint(1, 3)
        print(data2)
        self.client.get(
            "/s?wd=locust&rsv_spt=1&rsv_iqid=0xbb8514200006b7d0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=8&rsv_sug1=9&rsv_sug7=101&rsv_sug2=0&inputT=1458&rsv_sug4=1911&rsv_sug=2")


class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 3000
    max_wait = 6000
    stop_timeout = 5
    weight = 3
    host = "https://www.baidu.com"
           
Locust(性能測試)一、Locust 介紹二、Locust安裝三、建立性能測試參考

根據列印的結果就可以看出,data1被設為了全局變量,無論怎麼多次執行值都不會變;data2被設為函數變量,因為每次執行該函數(接口進行一次請求),該變量都會重新執行發生變化。

是以,如果接口需要參數不重複,将該參數的生成方法寫在執行函數中即可;

如果接口需要的參數保持不變,将該參數寫為全局變量即可

參考

http://www.testclass.net/locust/introduce

https://debugtalk.com/post/head-first-locust-advanced-script/