天天看點

Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser

目前本機測試環境:

官方文檔:Locust說明文檔

代碼位址: https://github.com/locustio/locust.git

pip 是一個安裝和管理 Python 包的工具 , 是 easy_install 的一個替換品。

pip freeze可以檢視已經安裝的python軟體包和版本

pip list 也可以

Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser

一、認識Locust

1、定義

Locust是一款易于使用的分布式負載測試工具,完全基于事件,即一個locust節點也可以在一個程序中支援數千并發使用者,不使用回調,通過gevent使用輕量級過程(即在自己的程序内運作)。

2、特點

①、不需要編寫笨重的UI或者臃腫的XML代碼,基于協程而不是回調,腳本編寫簡單易讀;

②、有一個基于we簡潔的HTML+JS的UI使用者界面,可以實時顯示相關的測試結果;

③、支援分布式測試,使用者界面基于網絡,是以具有跨平台且易于擴充的特點;

④、所有繁瑣的I / O和協同程式都被委托給gevent,替代其他工具的局限性;

3、locust與jmeter的差別

工具 差別
jmeter 需要在UI界面上通過選擇元件來“編寫”腳本,模拟的負載是線程綁定的,意味着模拟的每個使用者,都需要一個單獨的線程。單台負載機可模拟的負載數有限
locust 通過編寫簡單易讀的代碼完成測試腳本,基于事件,同樣配置下,單台負載機可模拟的負載數遠超jmeter

PS:但locust的局限性在于,目前其本身對測試過程的監控和測試結果展示,不如jmeter全面和詳細,需要進行二次開發才能滿足需求越來越複雜的性能測試需要。

二、安裝Locust

1、支援的python版本:2.7、3.4、3.5、3.6;

2、Windows系統安裝locust

①、直接通過 pip install locustio 指令安裝;

②、通過為pyzmq、gevent和greenlet安裝預先建構的二進制包,然後在這裡找到非官方的預制包,下載下傳.whl檔案後,使用 pip install name-of-file.whl 指令安裝;

安裝成功後可以輸入 pip show locust 指令檢視是否安裝成功,以及通過 locust -help 指令檢視幫助資訊。

PS:運作大規模測試時,建議在Linux機器上執行此操作,因為gevent在Windows下的性能很差。

Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser

三、一個簡單的示例

locust的腳本裡,模拟負載的請求和python的requests庫使用方法基本一樣,示例如下

# coding=utf-8
import requests
from locust import HttpLocust,TaskSet,task
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全請求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

class MyBlogs(TaskSet):
    # 通路我的部落格首頁
    @task(1)
    def get_blog(self):
        # 定義請求頭
        header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}

        req = self.client.get("/imyalost",  headers=header, verify=False)
        if req.status_code == 200:
            print("success")
        else:
            print("fails")

class websitUser(HttpLocust):
    task_set = MyBlogs
    min_wait = 3000  # 機關為毫秒
    max_wait = 6000  # 機關為毫秒

if __name__ == "__main__":
    import os
    os.system("locust -f locusttest.py --host=https://www.cnblogs.com")
           

 注意目前的環境版本:python3.6 + locust V1.1.1 是以報錯

C:\Users\Administrator\test>locust -f demo4.py --host=https://www.cnblogs.com
Traceback (most recent call last):
  File "d:\devtools\python36\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "d:\devtools\python36\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\devtools\Python36\Scripts\locust.exe\__main__.py", line 7, in <module>
  File "d:\devtools\python36\lib\site-packages\locust\main.py", line 113, in main
    docstring, user_classes = load_locustfile(locustfile)
  File "d:\devtools\python36\lib\site-packages\locust\main.py", line 77, in load_locustfile
    imported = __import_locustfile__(locustfile, path)
  File "d:\devtools\python36\lib\site-packages\locust\main.py", line 53, in __import_locustfile__
    return  source.load_module()
  File "<frozen importlib._bootstrap_external>", line 399, in _check_name_wrapper
  File "<frozen importlib._bootstrap_external>", line 823, in load_module
  File "<frozen importlib._bootstrap_external>", line 682, in load_module
  File "<frozen importlib._bootstrap>", line 265, in _load_module_shim
  File "<frozen importlib._bootstrap>", line 684, in _load
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\Administrator\test\demo4.py", line 21, in <module>
    class websitUser(HttpLocust):
  File "d:\devtools\python36\lib\site-packages\locust\util\deprecation.py", line 23, in __new__
    raise ImportError(deprecation_message)
ImportError: The HttpLocust class has been renamed to HttpUser in version 1.0. For more info see: https://docs.locust.io/en/latest/changelog.html#changelog-1-0
           

修改成:

# coding=utf-8
import requests
from locust import HttpUser,TaskSet,task
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全請求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

class MyBlogs(TaskSet):
    # 通路我的部落格首頁
    @task(1)
    def get_blog(self):
        # 定義請求頭
        header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}

        req = self.client.get("/imyalost",  headers=header, verify=False)
        if req.status_code == 200:
            print("success")
        else:
            print("fails")

class websitUser(HttpUser):
    tasks = [MyBlogs]
    min_wait = 3000  # 機關為毫秒
    max_wait = 6000  # 機關為毫秒

if __name__ == "__main__":
    import os
    os.system("locust -f locusttest.py --host=https://www.cnblogs.com")
           
Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser
from locust import HttpUser,TaskSet,task

class Demo(TaskSet):

    @task(1)
    def baidu(self):
        url = '/huahuage/p/12917114.html'
        header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
        req = self.client.get(url, headers=header, verify=False)

        if req.status_code == 200:
            print("success")
        else:
            print("fails")

class websitUser(HttpUser):
    tasks= [Demo]
    min_wait = 3000
    max_wait = 6000

if __name__=="__main__":
    import os
    os.system("locust -f demo.py --host=https://www.cnblogs.com")
           
Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser

腳本說明:

建立一個類MyBlogs(TaskSet),繼承TaskSet,該類下面寫需要請求的接口以及相關資訊;

self.client調用get和post方法,和requests一樣;

@task裝飾該方法表示為使用者行為,括号裡面參數表示該行為的執行權重:數值越大,執行頻率越高,不設定預設是1;

WebsiteUser()類用于設定生成負載的基本屬性:

屬性 說明
task_set  指向定義了使用者行為的類
min_wait  模拟負載的任務之間執行時的最小等待時間,機關為毫秒
max_wait  模拟負載的任務之間執行時的最大等待時間,機關為毫秒

PS:預設情況下,時間是在min_wait和max_wait之間随機選擇,但是可以通過将wait_function設定為任意函數來使用任何使用者定義的時間分布。

四、啟動Locust

1、如果啟動的locust檔案名為locustfile.py并位于目前工作目錄中,可以在編譯器中直接運作該檔案,或者通過cmd,執行如下指令:

 locust --host=https://www.cnblogs.com 

2、如果Locust檔案位于子目錄下且名稱不是locustfile.py,可以使用-f指令啟動上面的示例locust檔案:

 locust -f testscript/locusttest.py --host=https://www.cnblogs.com 

3、如果要運作分布在多個程序中的Locust,通過指定

-master

以下内容來啟動主程序 :

 locust -f testscript/locusttest.py --master --host=https://www.cnblogs.com 

4、如果要啟動任意數量的從屬程序,可以通過-salve指令來啟動locust檔案:

 locust -f testscript/locusttest.py --salve --host=https://www.cnblogs.com 

5、如果要運作分布式Locust,必須在啟動從機時指定主機(運作分布在單台機器上的Locust時不需要這樣做,因為主機預設為127.0.0.1):

 locust -f testscript/locusttest.py --slave --master-host=192.168.0.100 --host=https://cnblogs.com 

6、啟動locust檔案成功後,編譯器控制台會顯示如下資訊:

 [2018-10-09 01:01:44,727] IMYalost/INFO/locust.main: Starting web monitor at *:8089

[2018-10-09 01:01:44,729] IMYalost/INFO/locust.main: Starting Locust 0.8 

PS:8089是該服務啟動的端口号,如果是本地啟動,可以直接在浏覽器輸入http://localhost:8089打開UI界面,如果是其他機器搭建locust服務,則輸入該機器的IP+端口即可;

五、locust的UI界面 (C:\Users\Administrator\test>locust -f demo.py --host=https://www.cnblogs.com)

1、啟動界面

Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser

Number of users to simulate:設定模拟的使用者總數

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

Start swarming:執行locust腳本

2、測試結果界面

PS:點選STOP可以停止locust腳本運作:

Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser

Type:請求類型,即接口的請求方法;

Name:請求路徑;

requests:目前已完成的請求數量;

fails:目前失敗的數量;

Median:響應時間的中間值,即50%的響應時間在這個數值範圍内,機關為毫秒;

Average:平均響應時間,機關為毫秒;

Min:最小響應時間,機關為毫秒;

Max:最大響應時間,機關為毫秒;

Content Size:所有請求的資料量,機關為位元組;

reqs/sec:每秒鐘處理請求的數量,即QPS;

3、各子產品說明

Python+locust做性能測試 --- locustV1.1.1版本更新 HttpUser

New test:點選該按鈕可對模拟的總虛拟使用者數和每秒啟動的虛拟使用者數進行編輯;

Statistics:類似于jmeter中Listen的聚合報告;

Charts:測試結果變化趨勢的曲線展示圖,分别為每秒完成的請求數(RPS)、響應時間、不同時間的虛拟使用者數;

Failures:失敗請求的展示界面;

Exceptions:異常請求的展示界面;

Download Data:測試資料下載下傳子產品, 提供三種類型的CSV格式的下載下傳,分别是:Statistics、responsetime、exceptions;

以上即為locust的介紹和簡單使用以及說明,更多詳細的内容請參考官方文檔