如今有不少的性能測試工具,好比說咱們熟悉的loadrunner、jmeter、ab、webbench等等,這些工具若是對一個沒用過的朋友來講,學習起來比較不容易,可是若是你能看懂python代碼,會寫就更好了,就可用嘗試一下今天的主角Locust,一款基於python的性能測試工具,它的優勢是學習起來比較簡單,功能徹底自定製,使用比較靈活,支持分佈式。python
全部的性能測試工具都至少包含這3塊:web
一、壓力產生器,也就是能夠指定產生多大的壓力,多少併發;sublime-text
二、數據統計,也就是結果的展現,要統計TPS是多少,響應時間多少等等,這些數據; 瀏覽器
三、代理功能,代理功能呢說白了就一句話,分攤壓力。好比說你壓測的時候要用1000個併發,可是你的電腦(壓力機)配置比較弱,只支持500併發,再大電腦就死掉了,完犢子,壓測不了。那怎麼辦呢,就得分攤壓力,再管你同事借一臺電腦,倆電腦發壓力,那就能夠了,每一個人的電腦上500個併發,人多好乾活嘛,代理就是幹這個的,把這個上面的壓力分攤到別的電腦上。併發
固然Locust這3個功能都是有的。分佈式
Locust是python的一個第三方模塊,安裝很簡單,直接pip install locust便可,或者本身下載安裝包,手動安裝。安裝完成後,就有locust命令,在命令行裏面輸入 locust --help,有幫助信息就安裝成功了。以下圖:函數
locust的官網是 www.locust.io,上面也有怎麼安裝和例子。工具
怎麼用呢,很簡單,只須要幾行代碼就能夠實現,而且有漂亮的web界面,能夠設置併發數,和查看結果,首先咱們寫幾行簡單的代碼,寫一個打開BestTest首頁的腳本。post
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from locust import HttpLocust, TaskSet, task
#HttpLocust 這個類的做用是用來發送http請求的
#TaskSet 這個類是定義用戶行爲的,至關於loadrunnerhttp協議的腳本,jmeter裏面的http請求同樣,要去幹嗎的
#task 這個task是一個裝飾器,它用來把一個函數,裝飾成一個任務,也能夠指定他們的前後執行順序
class BestTest(TaskSet):
#本身定義的類,繼承TaskSet,也就是這個類是實現我們要去請求什麼的
@task#用task裝飾器把這個函數裝飾成一個我們要執行的性能任務
def index(self):#這個函數裏面定義的是我們要具體作的操做
self.client.get('/')#請求這個url裏面的哪一個路徑,若是是接口的話,就是哪一個接口
class BestTestIndexUser(HttpLocust):
#這個類繼承了HttpLocust,表明每一個併發裏面的每一個用戶
task_set = BestTest #這個是每一個用戶都去幹什麼,指定了BestTest這個類,它就會每一個用戶去運行besttest這個類裏面的方法
|
代碼寫好了,下面運行一下,看看結果,可是運行的時候不是像一個普通的python腳本同樣運行了, 得使用locust命令,在命令行裏運行性能
1
2
3
|
locust -f besttest.py --host=http://www.besttest.cn
#-f是指定一個python文件 後面跟上我們剛纔寫的python文件
#--host是你要訪問哪一個網站,後面跟網站的url
|
這樣就能夠運行,運行完以後,就能夠在瀏覽器裏面打開locust的控制檯了,locust的默認端口號是8089,運行完以後,訪問的時候用ip:8090就能夠訪問了,以下圖:
啓動locust:
locust控制檯頁面:
開始測試後的頁面:
tps圖和響應時間圖:
可是locust不像loadrunner和jmeter同樣能夠設置開始時間和結束時間,只能你本身點stop的時候中止測試,這一點比較煩,因此在使用過程當中仍是須要本身注意一下測試時間。
剛纔上面寫的例子是單個接口壓測, 或者更說單場景的,若是想作混合場景的壓測,好比說是一個業務流程,先登陸、而後下單、購物這樣的怎麼辦呢?
只須要寫多個task就能夠了,也就是在類裏面寫多個函數,想誰想執行,標上數字就好了,1,2,3,4代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from locust import HttpLocust, TaskSet, task
class BestTest(TaskSet):
@task(1)#給task裝飾器傳一個參數,表明先訪問首頁
def index(self):#首頁
self.client.get('/')
#發get請求
@task(2)
def login(self):#登陸
self.client.post('/login',{'username':'besttest','password':'123456'})
#發送post請求,第一個是路徑,第二個這個接口的入參,帳號和密碼
class BestTestIndexUser(HttpLocust):
#這個類繼承了HttpLocust,表明每一個併發裏面的每一個用戶
task_set = BestTest #這個是每一個用戶都去幹什麼,指定了BestTest這個類,它就會每一個用戶去運行besttest這個類裏面的方法
|
關於Locust就說這麼多,是否是很簡單呢,快去試試吧,有問題的小夥伴能夠留言哦~