Locust 從入門到實戰
學習背景
最近公司的測試任務不是很緊急,測試這邊有點閒置,但是作為一個合格的小測試,不應該讓自己太安逸了,正所謂,生於憂患,死於安樂,乾脆來個帶薪學習吧,為自己的飯碗增加一份保險?,於是把自己的核心技能梳理了一遍,發現自己在效能這塊,有點缺乏於是開始充電一波,於是決定入手Locust的的學習。
效能基礎知識
都知道locust是做效能測試的工具,那麼學習locust之前,一些基礎效能知識還是得知道的,個人粗略的說下。
效能分層
現在網際網路很常見的一種現象,就是前後端分離相互獨立,同理,我們效能也是分層次的,個人主要講效能分為前後兩端主要如下:
前端主要分為兩種架構型別的一種CS架構的app,小程式等和BS的web網頁網站,前端效能根據個理解主要範圍如下:
App:
卡頓,流暢度,資源消耗,流量消耗,穩定相容弱網等
Web:
基於瀏覽器的頁面渲染,js的效能消耗等
後端,也叫服務端,說白了,後端的主要效能,就是是大批量的前端,批量訪問服務端,個人理解需要關注的主要點如下:
- 協議
- 併發
- 場景設計模擬等
什麼是執行緒什麼是協程
工具選擇
說到效能測試工具,大部分的人都會先到 LR ,Jmeter,ad等工具,但是,由於LR雖然好,但是專業版本的需要人民幣,而且比較笨重,有人可能會說,那你選擇jmeter啊,但是我想說,LR和jmeter其實都是基於多執行緒實現的,舉個生活中的小栗子,我們面試都會碰見這樣一道題,請描述一個開啟一個網站的的過程。其實在效能方面,LR和jmetr,在做法上是又區別的,這裡以前端最討厭的瀏覽器,ie舉例說明,大家在使用ie瀏覽器開啟一個網站和使用LR或者jmeter開啟一個網站,有人關注過他們的時間嗎,他們三者之間的耗時速度分別如下:
ie比jmeter快,jmeter比LR快,原因是什麼呢,因為ie在開啟一個網站的時候,他的請求次數和使用lr或者jmeter的請求次數是一致的,lr錄製的時候,是吧是由靜態資源的請求都是錄製了,jmeter是隻錄製了部分的,沒有錄製完整的請求,即使從html檔案獲取資源也不可能達到。還有就是,lr(本人只玩了一下11)在開啟網站的時候,是比ie要慢的,因為,lr在獲取靜態資源的時候,只開了兩個執行緒,ie開了6個,所以ie比較快,但是其實相差不大,很多人可能覺得我i會選擇jmeter了,但是個人發現,凡是apache下面的東西都比較消耗cpu資源,現在加上jmeter本來就會,我乾脆換個工具學習吧,於是自己百度了一波,最終選擇Locust,理由,開源,現在加上locust是基於協程併發的,對cpu消耗較小,還有一點,本人java不會,python還會一點,即使以後二次改造,方便點,最後決定是由Locust。
Locust簡介
Locust官網
Locust官方文件
Locustgithub原始碼位置
什麼是locust
Locust是一款易於使用的分散式負載測試工具,完全基於事件,即一個locust節點也可以在一個程式中支援數千併發使用者,不使用回撥,通過gevent使用輕量級過程(即在自己的程式內執行)
Locust優點
- 不需要編寫笨重的UI或者臃腫的XML程式碼,基於協程而不是回撥,指令碼編寫簡單易讀
- 有一個基於we簡潔的HTML+JS的UI使用者介面,可以實時顯示相關的測試結果
- 支援分散式測試,使用者介面基於網路,因此具有跨平臺且易於擴充套件的特點
- 所有繁瑣的I/O和協同程式都被委託給gevent,替代其他工具的侷限性
- 開源免費,支援高併發,方便二次改造,打造效能自動化測試平臺
Locust和Jmeter的區別
由於自己之前會jmeter,個人還是希望比較一下他們的區別
Locust環境部署
直接pip安裝即可
pip install Locust
檢驗是否安裝成功
1.是由pip list可檢視即可
Locust實戰
上面說了這麼多,不能光說不練,接下來我們就通過一個簡單的小例子完成Locust的實戰。廢話不多說,直接上程式碼。。。。
# -*- coding: utf-8 -*-
# @Pjname ;ApiDome
# @Time :2020/11/30/22:19
# @Author :Yuye
# @File :LocustDome.py
from locust import HttpUser, task, TaskSet, events
import time, sys,
class UserBehavior(HttpUser):
def on_start(self):
print("執行壓測前置條件")
def get_response(self, response):
"""
獲取返回
:param response:請求返回物件
:return:
"""
start_time = int(time.time())
if response.status_code == 200:
events.request_success.fire(
request_type="recv",
name=sys._getframe().f_code.co_name,
response_time=int(time.time() - start_time) * 1000,
response_length=0
)
else:
events.request_failure.fire(
request_type="recv",
name=sys._getframe().f_code.co_name,
response_time=int(time.time() - start_time) * 1000,
response_length=0,
exception=f"Response Code Error! Code:{response.content}"
)
@task(1)
def test_get(self):
self.client.get("http://www.baidu.com", name="開啟百度首頁")
@task(1)
def test_post(self):
"""由於沒有免費的post介面暫時使用百度搜尋"""
self.client.get("http://www.baidu.com?wd=testerhome", name="使用百度搜尋")
class WebUser(TaskSet):
"""效能測試配置 換算配置"""
host = "http://www.baidu.com"
task_set = UserBehavior # Testcase類
min_wait = 1000
max_wait = 3000
上述程式碼的主要邏輯實現如下
新建一個類WebUser(TaskSet),繼承TaskSet,該類下面寫需要請求的介面以及相關資訊;self.client呼叫get和post方法,和requests一樣;@task裝飾該方法表示為使用者行為,括號裡面參數列示該行為的執行權重:數值越大,執行頻率越高,不設定預設是1;WebsiteUser()類用於設定生成負載的基本屬性:
如何執行locust
1、如果啟動的locust檔名為LocustDome.py並位於當前工作目錄中,可以在編譯器中直接執行該檔案,或者通過cmd,執行如下命令:
locust --host=http://www.baidu.com
2、如果Locust檔案位於子目錄下且名稱不是LocustDome.py,可以使用-f命令啟動上面的示例locust檔案:
locust -f LocustDome.py --host=http://www.baidu.com
3、如果要執行分佈在多個程式中的Locust,通過指定-master以下內容來啟動主程式 :
locust -f LocustDome.py --master --host=http://www.baidu.com
4、如果要啟動任意數量的從屬程式,可以通過-salve命令來啟動locust檔案:
locust -f LocustDome.py --worker --host=http://www.baidu.com
5、如果要執行分散式Locust,必須在啟動從機時指定主機(執行分佈在單臺機器上的Locust時不需要這樣做,因為主機預設為127.0.0.1):
locust -f LocustDome.py --worker --master-host=127.0.0.1 --host=http://www.baidu.com
6、啟動locust檔案成功後,編譯器控制檯會顯示如下資訊:
PS:8089是該服務啟動的埠號,如果是本地啟動,可以直接在瀏覽器輸入http://127.0.0.1:8089UI介面,如果是其他機器搭建locust服務,則輸入該機器的IP+埠即可;開啟
啟動成功如下
測試報告
相關文章
- Redis 從入門到實戰Redis
- Docker實戰-從入門到跑路Docker
- Docker從入門到實戰pdfDocker
- Uni-app從入門到實戰APP
- iOS逆向安防從入門到實戰iOS
- MongoDB一篇從入門到實戰MongoDB
- 小程式從入門到實戰系列(一)
- Docker 實戰教程之從入門到提高 (五)Docker
- Docker 實戰教程之從入門到提高 (六)Docker
- Docker 實戰教程之從入門到提高 (七)Docker
- Docker 實戰教程之從入門到提高 (八)Docker
- Docker 實戰教程之從入門到提高(三)Docker
- Docker 實戰教程之從入門到提高 (四)Docker
- Docker 實戰教程之從入門到提高(二)Docker
- Docker 實戰教程之從入門到提高(一)Docker
- go從入門到實戰-極客時間Go
- Spring Cloud 純乾貨,從入門到實戰SpringCloud
- Angularjs 從入門到實戰(含專案教程)AngularJS
- Linux入門到實戰Linux
- web3從入門到實戰-理論篇Web
- JVM 從入門到實戰--- 01 JVM 基本介紹JVM
- Python實戰案例彙總,帶你輕鬆從入門到實戰Python
- Gin + GORM 入門到實戰GoORM
- GraphQL 從入門到實踐
- web3從入門到實戰-NFT與代幣Web
- Spring Boot從入門到實戰(十):非同步處理Spring Boot非同步
- 前端大資料視覺化從入門到實戰前端大資料視覺化
- Hadoop大資料探勘從入門到進階實戰Hadoop大資料
- makefile從入門到入門
- scala 從入門到入門+
- Python專案實戰(一)《Python程式設計 從入門到實踐》Python程式設計
- Dubbo 一篇文章就夠了:從入門到實戰
- 全面系統學測試 從小白入門到實戰就業就業
- 全新SpringBoot框架教程,從入門到實戰一步到位Spring Boot框架
- Go語言從入門到實戰-蔡超-極客時間Go
- Spring Boot從入門到實戰:整合Web專案常用功能Spring BootWeb
- JVM 從入門到實戰 | 03 簡述垃圾回收演算法JVM演算法
- 第五課 以太坊開發框架Truffle從入門到實戰框架