性能測試工具Locust | iCourt技術(shù)
Locust介紹
性能測試工具市面上有很多位隶,除了我們耳熟能詳?shù)腖oadRunner拦止、Jmeter等測試工具,今天介紹一款小巧易用的性能測試工具:Locust。與LoadRunner串远、Jmeter這類大眾耳熟能詳?shù)男阅軠y試工相比:
--- | LoadRunner | Jmeter | Locust |
---|---|---|---|
授權(quán)方式 | 商業(yè)收費 | 開源免費 | 開源免費 |
開發(fā)語言 | C/Java | Java | Python |
測試腳本形式 | C/Java | GUI | Python |
并發(fā)機(jī)制 | 進(jìn)程/線程 | 線程 | 協(xié)程 |
單機(jī)并發(fā)能力 | 低 | 低 | 高 |
分布式壓力 | 支持 | 支持 | 支持 |
資源監(jiān)控 | 支持 | 不支持 | 不支持 |
報告與分析 | 完善 | 簡單圖表 | 簡單圖表 |
支持二次開發(fā) | 不支持 | 支持 | 支持 |
Locust最大的優(yōu)點是,單機(jī)并發(fā)能力儿惫,在我們?nèi)粘J褂玫腗AC電腦上可以達(dá)到1000并發(fā)澡罚,而LoadRunner只能在Windows平臺使用,并且并發(fā)效率比較低肾请,300并發(fā)基本可以將機(jī)器打滿留搔。另一個優(yōu)點是腳本開發(fā)簡單,Loadrunner的壓測腳本使用類C或者Java語言編寫铛铁,腳本的調(diào)試經(jīng)常讓人崩潰隔显,而Jmeter用GUI編寫。Locust采用Pure Python腳本描述饵逐,使得腳本編寫大大簡化括眠。
Locust安裝
Locust可以通過pip或者easy_install安裝:
pip install locustio
安裝完Locust后,shell命令locust就可以使用了倍权,可以查看locust命令有哪些選項:
locust --help
腳本編寫
完成了工具的準(zhǔn)備掷豺,就進(jìn)入到了第二步,腳本編寫薄声。首先我們要import進(jìn)來三個類当船,分別是HttpLocust(用來模擬發(fā)請求的類)、TaskSet(顧名思義奸柬,任務(wù)集)生年、task(任務(wù)類)。@task裝飾器裝飾的方法都是任務(wù)方法廓奕,里面包含了待請求的接口等信息抱婉,傳入的參數(shù)代表了權(quán)重档叔,如下所示兩個被@task裝飾的方法分別傳入3和1,這意味著每4個人里有3個模擬用戶執(zhí)行answer方法蒸绩,1個模擬用戶執(zhí)行status方法衙四。
簡單示例
from locust import HttpLocust, TaskSet,task
import random
class UserBehavior(TaskSet):
@task(3)
def answer(l):
url = "/api/v1/heroes/user/answers"
data = {"name": "多多" + str(random.randint(1,500)), "answer": "A"}
response = l.client.post(url, json=data, headers=header)
@task(1)
def status(l):
response = l.client.get("/api/v1/heroes/user/game/status", headers=header)
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 1
max_wait = 2
從腳本中可以看出,腳本主要包含兩個類患亿,一個是WebsiteUser(繼承自HttpLocust传蹈,而HttpLocust繼承自Locust),另一個是UserBehavior(繼承自TaskSet)步藕。事實上惦界,在Locust的測試腳本中,所有業(yè)務(wù)測試場景都是在Locust和TaskSet兩個類的繼承子類中進(jìn)行描述的咙冗。
Locust重要屬性介紹
task_set: 指向一個TaskSet類沾歪,TaskSet類定義了用戶的任務(wù)信息,該屬性為必填雾消;
max_wait/min_wait: 每個用戶執(zhí)行兩個任務(wù)間隔時間的上下限(毫秒)灾搏,具體數(shù)值在上下限中隨機(jī)取值,若不指定則默認(rèn)間隔時間固定為1秒立润; 由于性能測試往往希望給出的壓力越高越好狂窑,測試中可以將此參數(shù)調(diào)低。
host:被測系統(tǒng)的host桑腮,當(dāng)在終端中啟動locust時沒有指定--host參數(shù)時才會用到泉哈;
weight:同時運行多個Locust類時會用到,用于控制不同類型任務(wù)的執(zhí)行權(quán)重到旦。
Locust運行模式
no_web運行模式:
locust -f happy.py --host=123.com --no-web -c 1
web運行模式:
locust -f happy.py --host=123.com
這里的“-f”指定了要執(zhí)行的python文件路徑旨巷,“--host”指定了模擬用戶請求接口的host名。執(zhí)行該命令添忘,Locust項目就啟動了采呐。
當(dāng)并發(fā)壓力要求較高時,就需要用到Locust的多進(jìn)程分布式運行模式搁骑。
具體命令如下:
指定master:
locust -f happy.py --host=123.com --master
指定slave
locust -f happy.py --host=123.com --slave
Locust運行性能測試
在瀏覽器中輸入“http://localhost:8089/” 訪問斧吐,會看到如下頁面:
Number of users to simulate:設(shè)置需要模擬的用戶數(shù)量
Hatch rate:每秒需要啟動的用戶數(shù)量
這里我們按提示輸入要模擬的用戶總數(shù)和每秒鐘并發(fā)的用戶數(shù)量,點擊“Start swarming”就可以運行性能測試了:
Type:請求的類型仲器;
Name:請求的url或者自定義的統(tǒng)計分組名字煤率;
requests:當(dāng)前請求的數(shù)量;
fails:當(dāng)前請求失敗的數(shù)量乏冀;
Median:中間值蝶糯,一半的服務(wù)器響應(yīng)時間高于該值,而另一半的服務(wù)器響應(yīng)時間低于該值(毫秒)辆沦;
Average:所有請求的平均響應(yīng)時間(毫秒)昼捍;
Min:請求最小響應(yīng)時間(毫秒)识虚;
Max:請求最大響應(yīng)時間(毫秒);
Content Size:單個請求的大卸什纭(字節(jié))担锤;
reqs/sec:每秒請求的個數(shù);
斷言與別名
可以對返回response內(nèi)容自定義處理乍钻,因為即使返回code是200肛循,但從業(yè)務(wù)上講可能操作是失敗的,另外如果一個URL的參數(shù)是固定的,但是參數(shù)值是不定的, 也可以通過name來處理银择。
with l.client.get("/api/v1/heroes/user/game/status", headers=headers, catch_response=True, name = "getTask") as response:
if "成功" in response.text:
response.success()
else:
response.failure("斷言失敗")