Locust 從入門到實戰

欲野發表於2020-12-01

學習背景

最近公司的測試任務不是很緊急,測試這邊有點閒置,但是作為一個合格的小測試,不應該讓自己太安逸了,正所謂,生於憂患,死於安樂,乾脆來個帶薪學習吧,為自己的飯碗增加一份保險?,於是把自己的核心技能梳理了一遍,發現自己在效能這塊,有點缺乏於是開始充電一波,於是決定入手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優點

  1. 不需要編寫笨重的UI或者臃腫的XML程式碼,基於協程而不是回撥,指令碼編寫簡單易讀
  2. 有一個基於we簡潔的HTML+JS的UI使用者介面,可以實時顯示相關的測試結果
  3. 支援分散式測試,使用者介面基於網路,因此具有跨平臺且易於擴充套件的特點
  4. 所有繁瑣的I/O和協同程式都被委託給gevent,替代其他工具的侷限性
  5. 開源免費,支援高併發,方便二次改造,打造效能自動化測試平臺

##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 testscript/locusttest.py --master --host=http://www.baidu.com

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

locust -f LocustDome.py --salve --host=http://www.baidu.com

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

locust -f LocustDome.py --slave --master-host=127.0.0.1 --host=http://www.baidu.com

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

PS:8089是該服務啟動的埠號,如果是本地啟動,可以直接在瀏覽器輸入http://127.0.0.1:8089UI介面,如果是其他機器搭建locust服務,則輸入該機器的IP+埠即可;開啟

啟動成功如下

測試報告

相關文章