官方文檔: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妙啃;