1.概述:
1.我們對目前比較流行的幾款壓測工具進行了調研。Jmeter與LoadRunner基於多線程實現並發,多線程由操作系統決定,由於上下文切換頻繁、內核調度頻繁,單台機器很難產生大量線程並發。以多線程方式運行會有很多線程切換的開銷,故而考慮多協程方式實現,
Jmeter由Java語言編寫,並不支持協程機制。Python語言通過async/await的方式實現協程,而Locust正是基於python。
2..Locust 完全是基於事件的,因此在一台機器上支持數千個並發用戶是可能的。與許多其他基於事件的應用程序不同,它不使用回調。相反它通過 gevent 使用輕量級協程。這允許您用 Python 編寫非常有表現力的場景,而不用回調使代碼復雜化。
2.壓測工具對比:
當你想做性能測試的時候,你會選擇什么樣的測試工具呢?是會選擇wrk?jmeter?locust?還是loadrunner呢?
備注:服務端數據可以通過nmon_analyser或者Grafana監控
3.優缺點說明:
3.1jmeter采用線程並發機制,但其主要依靠增加線程數提高並發量,當單機模擬數以千計的並發用戶時,對於CPU和內存的消耗比較大,jmeter本身具有以下優點和缺點:
優點:①界面可視化操作,可以使用錄制腳本方式對較為復雜的用戶流建模,還可以創建斷言來驗證測試行為是否通過;
②表格、圖形、結果樹等多類可視化數據分析和報告輸出;
③支持http、ftp、tcp等多種協議類型測試;
④支持分布式壓力測試,但對於上萬的用戶並發測試需要多台測試機支持,資源要求比較大;
⑤可以用於測試固定吞吐量下的系統性能,例如在100QPS(QPS:每秒查詢率)下系統的響應時間和資源消耗;
缺點:①jmeter的GUI模式消耗資源較大,當需要測試高負載時,需要先使用GUI工具來生成XML測試計划,然后在非GUI模式下導入測試計划運行測試,並且關閉不需要的偵聽器(收集數據與展示測量的組件),因為偵聽器也會消耗掉本用於生成負載的大量資源。測試結束后后,需要將原始結果數據導入GUI以才能查看結果。
3.2.locust是一個的簡單易用的分布式負載測試工具,主要用來對網站進行負載壓力測試。locust使用python語言開發,測試資源消耗遠遠小於java語言開發的jmeter。且其支持分布式部署測試,能夠輕松模擬百萬級用戶並發測試。
優點:①locust借助於協程實現對用戶的模擬,相同物理資源(機器cpu、內存等)單台負載機可模擬的負載數遠超jmeter;
②相比jmeter需要界面點擊錄制復雜場景的麻煩,locust只需用戶使用python編寫用戶場景完成測試;
③不同與jmeter復雜的用戶使用界面,locust的界面干凈整潔,可以實時顯示測試的相關細節(如發送請求數、失敗數和當前發送請求速度等);
④locust雖然是面向web應用測試的,但是它可以用來測試幾乎所有系統。給locust編寫一個客戶端,可以滿足你所有的測試要求;
缺點:①同wrk一樣,locust測試結果輸出不如jmeter的測試結果展示類型多;
4.Locust的指標體系:
(1)響應時間
反應系統處理效率指標,從開始到完成某項工作所需要時間的度量,響應時間通常隨着負載的增加而增加;
(2)吞吐率(QPS)
(3)事務處理能力(TPS在locust中為RPS)
##___________________________Locust環境搭建_________________________________________________________________________
1.安裝locust:
pip3 install locust
檢查是否安裝成功,執行命令:locust --v
2.腳本實例:
#!/usr/bin/env python # -*- coding: utf-8 -*- from locust import HttpUser, TaskSet, task # 定義用戶行為類 class UserBehavior(TaskSet): @task # 任務項 def test_login(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"} url = '/login.htm' res = self.client.get(url,headers=header, verify=False) #斷言方式一 #assert res.status_code == 200 #斷言方式二 if res.status_code == 200: print('登陸成功!') else: print('登陸失敗!') class WebSiteUser(HttpUser): tasks = [UserBehavior] #host = "https://www.cnblogs.com" max_wait = 5000 min_wait = 1000 if __name__ == "__main__": import os os.system("locust -f test.py --host=https://www.cnblogs.com")#這樣寫可以直接運行文件,也可以命令調用文件
多個接口測試腳本

#!/usr/bin/env python # -*- coding: utf-8 -*- from locust import HttpUser,TaskSet,task class UserBehavior(TaskSet): @task def chen_users(self): headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##設置請求Headers頭部 #請求輸入參數 p = {"game_id":"20210708110"} url='/subcontract' res=self.client.post(url=url,headers=headers,params=p) if res.status_code == 200: print('登陸成功!') else: print('登陸失敗!') @task(1) def test_groups(self): headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##設置請求Headers頭部 res=self.client.get("/getcontract", headers= headers) if res.status_code == 200: print('test登陸成功!') else: print('test登陸失敗!') class WebsiteUser(HttpUser): tasks = [UserBehavior] min_wait = 3000 max_wait = 6000 if __name__ == "__main__": import os os.system("locust -f test.py --host=http://106.55.29.87:8000")
UserBehavior 類繼承TaskSet 類,用於描述用戶行為。
-
@task
約定該方法為一個事件,一部分的數字表示請求比例,上面的比例為2:1
默認1:1
-
test_users()
方法表示一個用戶行為,這里是請求user
接口。 -
test_groups()
方法表示請求group
接口。 -
client.get()
用於指定請求的路徑。
網站用戶類用於設置性能測試。
-
task_set
:一個定義的用戶行為類。 -
min_wait
:執行事務之間用戶等待時間的下界(單位:毫秒)。 -
max_wait
:執行事務之間用戶等待時間的上界(單位:毫秒)。
3.執行測試:
web模式:
使用命令行啟動測試: locust -f test.py --host=https://www.cnblogs.com .................................................... .......普通啟動
locust -f E:\test\dalan_sparrow\sparrow\test.py --host=https://www.cnblogs.com --web-port 8091 ...............啟動時指定端口
如果要運行分布式Locust,必須在啟動從機時指定主機(運行分布在單台機器上的Locust時不需要這樣做,因為主機默認為127.0.0.1):
locust -f testscript/locusttest.py --slave --master-host=192.168.0.100 --host=https://cnblogs.com
如果要運行分布在多個進程中的Locust,通過指定-master
以下內容來啟動主進程 :
locust -f testscript/locusttest.py --master --host=https://www.cnblogs.com
no web 模式:
1. locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
2. locust -f D:\PycharmProjects\UItest\locust_scripts\locust_test2.py --no-web -c 1 -r 1 -t 10s --csv=d:
啟動參數:
--no-web 表示不使用Web界面運行測試。
-c 設置虛擬用戶數。
-r 設置每秒啟動虛擬用戶數。
-t 設置設置運行時間。
--csv運行結果保存目錄
備注:
1.Locust no-web模式執行命令提示locust: error: unrecognized arguments: -no-web -c 的問題
解決:將命令參數--no-web 更改為 --headless,將命令中指定用戶並發數的參數 -c 改為 -u即可。
執行測試后在瀏覽器打開localhost:8089
可以看到如下頁面:
-
Number of users to simulate:設置模擬用戶數。
-
Hatch rate(users spawned/second):每秒產生(啟動)的虛擬用戶數。
-
單擊“Start swarming”按鈕,開始運行性能測試
運行之后可以看到主界面如下:
性能測試參數如下。
-
Type:請求的類型,例如GET/POST。
-
Name:請求的路徑。
-
request:當前請求的數量。
-
fails:當前請求失敗的數量。
-
Median:響應時間的中間值,即50%的響應時間在這個數值范圍內,單位為毫秒;
-
Average:平均值,單位毫秒,所有請求的平均響應時間。
-
Min:請求的最小服務器響應時間,單位毫秒。
-
Max:請求的最大服務器響應時間,單位毫秒。
-
Content Size:單個請求的大小,單位字節。
-
reqs/sec:每秒鍾請求的個數。即QPS
點擊Charts
菜單可以查看性能圖表
圖表含義如下:
-
Total Request per Second :每秒的請求數
-
Average Response Time: 平均響應時間
-
Number of Users: 用戶數
相關連接:
https://blog.csdn.net/weixin_38320674/article/details/108505688 ....................QPS、TPS、並發用戶數、吞吐量關系
https://zhuanlan.zhihu.com/p/282824807 ........................locust代碼案例
https://www.cnblogs.com/shenh/p/12424990.html ....................locust環境流程(包含分布式)
https://www.cnblogs.com/imyalost/p/9758189.html ......................locust基本環境流程
https://www.cnblogs.com/yoyoketang/p/9642242.html .................先登錄場景案例
https://testerhome.com/topics/12712 .............................................Locust 簡單例子
https://mp.weixin.qq.com/s?__biz=MzAxNjg3MTU4OQ==&mid=2247484282&idx=1&sn=f529a433410dde29ffb86efd792956aa ................locust匯總(包含no web模式)
https://testerhome.com/topics/24873 .......................................重新定義 Locust 的測試報告_性能監控平台
https://mp.weixin.qq.com/s/tIVdUfQlCnsKVC0VMLynLQ .............從0到1開展性能測試必備的性能測試要點!