天天看點

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

背景

最近自己開發了一個小的接口,功能測完了,突然想測下性能,原來做性能測試,我一直用的是HP的LoadRunner,前一段時間正好看過locust,想想就用這個來測測性能吧。

由于對LR比較熟,正好做個對比,這樣更利于對新東西的了解。

基礎

目前locust還隻支援Python 2版本。

測試需求

驗證在相同的伺服器端的情況下,使用LR和locust分别進行性能測試,在相同并發使用者的情況下,驗證平均響應時間,TPS值等性能測試名額的差異。

為了友善,使用http協定,一個get請求,一個post請求,交易比例為1:1。

伺服器端

為了簡單易了解,用Python的bottle架構寫了一個伺服器端,2個交易,一個get,一個post請求,交易中加了2個不同的sleep。

代碼如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

__author__ = 'among,[email protected]'

from bottle import *

from time import sleep

app = Bottle()

@app.route('/transaction_1', method='GET')

def tr1():

sleep(0.2)

resp = dict()

resp['status'] = 0

resp['value'] = 'xxx'

return resp

@app.route('/transaction_2', method='POST')

def tr2():

parm1 = request.forms.get('parm1')

parm2 = request.forms.get('parm2')

sleep(0.5)

resp = dict()

resp['status'] = 0

resp['value'] = 'yyy'

return resp

run(app=app, server='cherrypy', host='0.0.0.0', port=7070, reloader=False, debug=False)

伺服器端部署在一個單獨的Windows的機器中,基于Python 3,啟動後,監聽7070端口。

LR中的測試腳本

在另外的一個Windows機器中,使用LR 11,用的是http/html協定的腳本,主要代碼如下:

用了2個action,用于劃分交易比例。

action1:

Action1()

{

lr_start_transaction("get");

web_reg_find("Text=xxx",

LAST);

web_custom_request("Head",

"URL=http://10.0.244.108:7070/transaction_1",

"Method=GET",

"Resource=0",

"Referer=",

LAST);

lr_end_transaction("get", LR_AUTO);

return0;

}

action2:

Action2()

{

lr_start_transaction("post");

web_reg_find("Text=yyy",

LAST);

web_custom_request("Head",

"URL=http://10.0.244.108:7070/transaction_2",

"Method=POST",

"Resource=0",

"Referer=",

"Body=parm1=123&parm2=abc",

LAST);

lr_end_transaction("post", LR_AUTO);

return0;

}

使用1:1的比例設定2個transaction的執行比例:

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

LR中的執行方法,直接放到場景中,執行即可。

locust中的測試腳本

在另外的mac中,使用locust執行測試,全部通過代碼實作。代碼如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

__author__ = 'among,[email protected]'

from locust import *

class mytest(TaskSet):

@task(weight=1)

def transaction_1(self):

with self.client.get(name='get', url='/transaction_1', catch_response=True) as response:

if 'xxx' in response.content:

response.success()

else:

response.failure('error')

@task(weight=1)

def transaction_2(self):

dt = {

'parm1': '123',

'parm2': 'abc'

}

with self.client.post(name='post', url='/transaction_2', data=dt, catch_response=True) as response:

if 'yyy' in response.content:

response.success()

else:

response.failure('error')

class myrun(HttpLocust):

task_set = mytest

host = 'http://10.0.244.108:7070'

min_wait = 0

max_wait = 0

具體的參數可以檢視官方文檔。

其中:

1. 主類繼承HttpLocust,用于測試http協定的系統;

2. min_wait和max_wait用于設定執行task過程中的等待時間,相當于LR中Pacing的設定,這裡都設定為0;

3. task裝飾器類似于LR中的事務,可以做嵌套;

4. weight相當于權重,如2個事務是1:1,保持比例一緻就行;

5. 這裡寫了2個事務,分别為get和post;對response的判斷通過python的文法實作,類似于LR中的檢查點。

執行方法,通過指令行啟動:

如下圖:

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

LR中的測試過程和結果

測試過程:

直接設定并發使用者數和加載方式,10個使用者并發,同時加載就可以了。

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

測試結果:

平均響應時間:

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

TPS:

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

事務:

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

Locust中的測試過程和結果

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

設定需要的并發使用者數和使用者加載政策。

這裡設定相同的10使用者并發,Hatch Rate是每秒啟動多少使用者的意思。這裡設定為10,就是同時啟動10個了。注意,這裡不好設定執行多久,和LR不一樣。(可以不啟動浏覽器,直接在啟動參數中設定并發使用者數,執行多少個事務後結束,具體用-h可以看到幫助)

啟動執行後:

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

其中,Average中為平均響應時間等測試名額,最後一列的reqs/sec相當于LR中的TPS。(這裡locust把它叫做rps),其他名額都比較好了解了。

最後的結果:

在web頁面中可以下載下傳原始的測試結果資料。

在停掉python指令後,在終端中也可以看到一些資訊,最後的一行是百分之X的響應時間,表示百分之多少的交易在XXX響應時間内。

這裡比LR中的要多點,包括了50%到100%的響應時間。

python性能測試工具_基于Python的性能測試工具locust (與 LR 的簡單對比)

結果比較

在相同的伺服器端環境,測試的結果值相似,沒有多大的差別。

在設定交易比例的過程中,可以看到get和post交易的比例都存在差異。這個也無法避免(除非自己寫腳本劃分)。是以tps方面存在些差異。不過總體差距很小。

總結

性能測試,重點是考察并發使用者數、響應時間、tps這類名額。

一直用的是LR,LR在一起概念上更易于了解,在有lr的基礎上,在看其他的工具,就比較容易了。

locust也可以支援分布式執行(多執行機),用來簡單測試這類http的接口,也算比較友善。

而且,locust全部基于Python腳本,擴充性不錯,号稱可以測試任何協定和系統。

最後,我還是那句話,看什麼事情,用什麼工具最高效易用,用合适的工具做合适的事情即可。

備注:

調試的時候都是連接配接的代理,這樣友善。一種方法是自己在外面的py中先調試好,然後再放到locust中執行。另一種是使用指令行啟動 locust如:locust -f loc1.py --no-web -c 1 -n 4-c是指并發數,-n是執行的次數。少跑點,調試友善。這樣配合代理,調試也不複雜。

用指令行還可以自動化執行,執行的結果也可以通過日志或output來分析。