python locust api_干货 | 基于Locust的接口压测
作者介紹:吳鋒雷。PP云高級(jí)測(cè)試工程師,擁有10年業(yè)務(wù)研發(fā)和測(cè)試經(jīng)驗(yàn),目前負(fù)責(zé)SDK及相關(guān)產(chǎn)品的測(cè)試工作。
系統(tǒng)上線前一般要通過(guò)壓力測(cè)試來(lái)判斷下是否能承受預(yù)估的訪問(wèn)量,假設(shè)我們要測(cè)試的接口每天訪問(wèn)量是10萬(wàn),那么平均下來(lái)的RPS(request per second)大概是10,假設(shè)高峰時(shí)訪問(wèn)量是平時(shí)的3倍,那么要上線,RPS必須在30+以上,下面以Locust為例說(shuō)明下要達(dá)成這個(gè)目標(biāo),怎么來(lái)實(shí)現(xiàn)壓測(cè)。
概述
Locust是一個(gè)基于python的壓力測(cè)試工具,可以通過(guò)寫(xiě)python腳本的方式來(lái)定義用戶(hù)行為對(duì)web接口進(jìn)行性能測(cè)試,擴(kuò)展性比較好,也可以在較快地實(shí)現(xiàn)性能測(cè)試。與其他性能測(cè)試工具LoadRunner,Jmeter之類(lèi)的工具相比,Locust的優(yōu)點(diǎn)有:
1. Locust采用Python腳本描述,比較容易實(shí)現(xiàn)復(fù)雜的因果邏輯,比如待壓的接口有完整的流程的,假設(shè)程序要訪問(wèn)一個(gè)api,可以把鑒權(quán)返回的token放在Queue中,然后在調(diào)用接口的task中取得Queue中的token就可以了。另外python腳本也比較容易實(shí)現(xiàn)虛擬用戶(hù)使用的數(shù)據(jù)不重復(fù),保證并發(fā)測(cè)試數(shù)據(jù)唯一性。
2. Locust的http請(qǐng)求基于Request庫(kù),這個(gè)庫(kù)簡(jiǎn)潔易用,功能十分強(qiáng)大。
3. Locust的并發(fā)機(jī)制摒棄了進(jìn)程和線程,采用協(xié)程(gevent)的機(jī)制使,用協(xié)程提供的阻塞IO和coroutine來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)層的并發(fā)請(qǐng)求,即使是單臺(tái)壓力機(jī)也能產(chǎn)生數(shù)千并發(fā)請(qǐng)求數(shù);因此Locust能在使用較少壓力機(jī)的前提下支持極高并發(fā)數(shù)的測(cè)試。
基本概念
HttpLocust繼承了locust 類(lèi), 添加了可以發(fā)送http請(qǐng)求的功能。
HttpLocust類(lèi)有如下屬性:
task_set:在taskset類(lèi)定義了每個(gè)用戶(hù)的行為。
min_wait:每個(gè)任務(wù)最少間隔多久執(zhí)行一次。
max_wait:每個(gè)任務(wù)最少間隔多久執(zhí)行一次。
Host:被壓測(cè)的網(wǎng)站的域名。
Weight:一個(gè)Locust實(shí)例被挑選執(zhí)行的權(quán)重,數(shù)值越大,執(zhí)行頻率越高。
應(yīng)用實(shí)例
我們以ppyun的一些接口為例,看下locust怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)單的性能測(cè)試。
代碼示例:
上面的例子腳本中主要包含了兩個(gè)類(lèi):PptvyunTasks和WebsiteUser,其中PptvyunTasks是繼承了TaskSet,而WebsiteUser是繼承了HttpLocust。
我們使用Locust腳本測(cè)試的時(shí)候,所有的場(chǎng)景都是依賴(lài)這兩個(gè)基類(lèi)來(lái)進(jìn)行描述的。PptvyunTasks類(lèi)中定義的是指我們測(cè)試任務(wù)中的具體業(yè)務(wù)操作,上面的腳本的意思就是訪問(wèn)一個(gè)svc.pptvyun.com路徑下兩個(gè)不同的接口,其中兩個(gè)請(qǐng)求最小間隔1000ms最大的間隔為5000ms,兩個(gè)請(qǐng)求比例為2比1。
打開(kāi)http://localhost:8089/頁(yè)面就能看到如下頁(yè)面:填寫(xiě)要模擬的用戶(hù)數(shù)(Numberof user to simulate)和每秒產(chǎn)生的用戶(hù)數(shù)(Hatchrate)
點(diǎn)擊Startswarming后,得到如下結(jié)果。可以看到由于代碼中config接口的權(quán)重是1,getplayinfo的權(quán)重是2。產(chǎn)生的請(qǐng)求數(shù)量getplayinfo接口大概是config接口的兩倍。RPS在逐步提升到30后,系統(tǒng)的響應(yīng)時(shí)間趨于穩(wěn)定,在30ms左右。
通過(guò)前面對(duì)Locust的使用,可以看到Locust的結(jié)果展示比較簡(jiǎn)單,主要關(guān)注并發(fā)數(shù)、RPS、響應(yīng)時(shí)間、異常率這幾個(gè)指標(biāo),與其它工具相比要少一些,但對(duì)多數(shù)的場(chǎng)景已經(jīng)夠用了。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python locust api_干货 | 基于Locust的接口压测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么加载文件_Java虚拟机从入门到入土
- 下一篇: java 安卓调试,Android St