現在有很多的性能測試工具,比如說我們熟悉的loadrunner、jmeter、ab、webbench等等,這些工具如果對一個沒用過的朋友來說,學習起來比較不容易,但是如果你能看懂python代碼,會寫就更好了,就可用嘗試一下今天的主角Locust,一款基於python的性能測試工具,它的優點是學習起來比較簡單,功能完全自定制,使用比較靈活,支持分布式。
所有的性能測試工具都至少包含這3塊:
1、壓力產生器,也就是可以指定產生多大的壓力,多少並發;
2、數據統計,也就是結果的展示,要統計TPS是多少,響應時間多少等等,這些數據;
3、代理功能,代理功能呢說白了就一句話,分攤壓力。比如說你壓測的時候要用1000個並發,但是你的電腦(壓力機)配置比較弱,只支持500並發,再大電腦就死掉了,完犢子,壓測不了。那怎么辦呢,就得分攤壓力,再管你同事借一台電腦,倆電腦發壓力,那就可以了,每個人的電腦上500個並發,人多好干活嘛,代理就是干這個的,把這個上面的壓力分攤到別的電腦上。
當然Locust這3個功能都是有的。
Locust是python的一個第三方模塊,安裝很簡單,直接pip install locust即可,或者自己下載安裝包,手動安裝。安裝完成后,就有locust命令,在命令行里面輸入 locust --help,有幫助信息就安裝成功了。如下圖:
locust的官網是 www.locust.io,上面也有怎么安裝和例子。
怎么用呢,很簡單,只需要幾行代碼就可以實現,並且有漂亮的web界面,可以設置並發數,和查看結果,首先我們寫幾行簡單的代碼,寫一個打開BestTest首頁的腳本。
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就說這么多,是不是很簡單呢,快去試試吧,有問題的小伙伴可以留言哦~