python性能測試工具Locust(一)

官方文檔:Locust說明文檔

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

一两嘴、Locust

1、定義

Locust是一款易于使用的分布式負載測試工具,完全基于事件纫普,即一個locust節(jié)點也可以在一個進程中支持數(shù)千并發(fā)用戶宇弛,不使用回調(diào)博其,通過gevent使用輕量級過程(即在自己的進程內(nèi)運行)炫欺。

2伶跷、特點

①蚓炬、不需要編寫笨重的UI或者臃腫的XML代碼松逊,基于協(xié)程而不是回調(diào),腳本編寫簡單易讀肯夏;

②经宏、有一個基于we簡潔的HTML+JS的UI用戶界面,可以實時顯示相關(guān)的測試結(jié)果驯击;

③烁兰、支持分布式測試,用戶界面基于網(wǎng)絡(luò)余耽,因此具有跨平臺且易于擴展的特點缚柏;

④、所有繁瑣的I / O和協(xié)同程序都被委托給gevent碟贾,替代其他工具的局限性币喧;

3、locust與jmeter的區(qū)別

jmeter  
需要在UI界面上通過選擇組件來“編寫”腳本袱耽,模擬的負載是線程綁定的杀餐,意味著模擬的每個用戶,都需要一個單獨的線程朱巨,單臺負載機可模擬的負載數(shù)有限史翘。

locust  
通過編寫簡單易讀的代碼完成測試腳本,基于事件,同樣配置下琼讽,單臺負載機可模擬的負載數(shù)遠超jmeter必峰。
PS:但locust的局限性在于,目前其本身對測試過程的監(jiān)控和測試結(jié)果展示钻蹬,不如jmeter全面和詳細吼蚁,需要進行二次開發(fā)才能滿足需求越來越復(fù)雜的性能測試需要。

二问欠、安裝Locust

1肝匆、支持的python版本:2.7、3.4顺献、3.5旗国、3.6;

2注整、Windows系統(tǒng)安裝locust

①能曾、直接通過 pip install locustio 命令安裝;

②设捐、通過為pyzmq借浊、gevent和greenlet安裝預(yù)先構(gòu)建的二進制包,然后在這里找到非官方的預(yù)制包萝招,下載.whl文件后蚂斤,使用 pip install name-of-file.whl 命令安裝;

安裝成功后可以輸入 pip show locust 命令查看是否安裝成功槐沼,以及通過 locust -help 命令查看幫助信息曙蒸。

PS:運行大規(guī)模測試時,建議在Linux機器上執(zhí)行此操作岗钩,因為gevent在Windows下的性能很差纽窟。

三、一個簡單的示例
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")
 注意目前的環(huán)境版本: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")


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")

腳本說明:

新建一個類MyBlogs(TaskSet),繼承TaskSet视搏,該類下面寫需要請求的接口以及相關(guān)信息审孽;

self.client調(diào)用get和post方法,和requests一樣浑娜;

@task裝飾該方法表示為用戶行為佑力,括號里面參數(shù)表示該行為的執(zhí)行權(quán)重:數(shù)值越大,執(zhí)行頻率越高筋遭,不設(shè)置默認是1打颤;

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

屬性 說明
task_set 指向定義了用戶行為的類
min_wait 模擬負載的任務(wù)之間執(zhí)行時的最小等待時間暴拄,單位為毫秒
max_wait 模擬負載的任務(wù)之間執(zhí)行時的最大等待時間,單位為毫秒
PS:默認情況下编饺,時間是在min_wait和max_wait之間隨機選擇乖篷,但是可以通過將wait_function設(shè)置為任意函數(shù)來使用任何用戶定義的時間分布。

四反肋、啟動Locust

1那伐、如果啟動的locust文件名為locustfile.py并位于當(dāng)前工作目錄中踏施,可以在編譯器中直接運行該文件石蔗,或者通過cmd,執(zhí)行如下命令:

 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以下內(nèi)容來啟動主進程 :

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

4棍厌、如果要啟動任意數(shù)量的從屬進程,可以通過-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是該服務(wù)啟動的端口號,如果是本地啟動憎亚,可以直接在瀏覽器輸入http://localhost:8089打開UI界面员寇,如果是其他機器搭建locust服務(wù),則輸入該機器的IP+端口即可第美;

五蝶锋、locust的UI界面

(C:\Users\Administrator\test>locust -f demo.py --host=https://www.cnblogs.com

1、啟動界面

Number of users to simulate:設(shè)置模擬的用戶總數(shù)

Hatch rate (users spawned/second):每秒啟動的虛擬用戶數(shù)

Start swarming:執(zhí)行l(wèi)ocust腳本

2什往、測試結(jié)果界面

PS:點擊STOP可以停止locust腳本運行:


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

Name:請求路徑别威;

requests:當(dāng)前已完成的請求數(shù)量躯舔;

fails:當(dāng)前失敗的數(shù)量;

Median:響應(yīng)時間的中間值兔港,即50%的響應(yīng)時間在這個數(shù)值范圍內(nèi)庸毫,單位為毫秒;

Average:平均響應(yīng)時間衫樊,單位為毫秒飒赃;

Min:最小響應(yīng)時間利花,單位為毫秒;

Max:最大響應(yīng)時間载佳,單位為毫秒炒事;

Content Size:所有請求的數(shù)據(jù)量,單位為字節(jié)蔫慧;

reqs/sec:每秒鐘處理請求的數(shù)量挠乳,即QPS;

3姑躲、各模塊說明

New test:點擊該按鈕可對模擬的總虛擬用戶數(shù)和每秒啟動的虛擬用戶數(shù)進行編輯睡扬;

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

Charts:測試結(jié)果變化趨勢的曲線展示圖黍析,分別為每秒完成的請求數(shù)(RPS)卖怜、響應(yīng)時間、不同時間的虛擬用戶數(shù)阐枣;

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

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

Download Data:測試數(shù)據(jù)下載模塊蔼两, 提供三種類型的CSV格式的下載甩鳄,分別是:Statistics、responsetime额划、exceptions妙啃;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锁孟,隨后出現(xiàn)的幾起案子彬祖,更是在濱河造成了極大的恐慌,老刑警劉巖品抽,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件储笑,死亡現(xiàn)場離奇詭異,居然都是意外死亡圆恤,警方通過查閱死者的電腦和手機突倍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盆昙,“玉大人羽历,你說我怎么就攤上這事〉玻” “怎么了秕磷?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炼团。 經(jīng)常有香客問我澎嚣,道長疏尿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任易桃,我火速辦了婚禮褥琐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晤郑。我一直安慰自己敌呈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布造寝。 她就那樣靜靜地躺著磕洪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匹舞。 梳的紋絲不亂的頭發(fā)上褐鸥,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音赐稽,去河邊找鬼。 笑死浑侥,一個胖子當(dāng)著我的面吹牛姊舵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寓落,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼括丁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伶选?” 一聲冷哼從身側(cè)響起史飞,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仰税,沒想到半個月后构资,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡陨簇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年吐绵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河绽。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡己单,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耙饰,到底是詐尸還是另有隱情纹笼,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布苟跪,位于F島的核電站廷痘,受9級特大地震影響矮嫉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牍疏,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一蠢笋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳞陨,春花似錦昨寞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掏导,卻和暖如春享怀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趟咆。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工添瓷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人值纱。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓鳞贷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虐唠。 傳聞我的和親對象是個殘疾皇子搀愧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容