基於 Python 的性能測試工具 locust 與 LR 的簡單對比[轉發]


原博客地址:https://testerhome.com/topics/4839

背景

最近自己開發了一個小的接口,功能測完了,突然想測下性能,原來做性能測試,我一直用的是HP的LoadRunner,前一段時間正好看過locust,想想就用這個來測測性能吧。
由於對LR比較熟,正好做個對比,這樣更利於對新東西的理解。

基礎

locust 的官網:http://locust.io/

也可以參考論壇里其他同學的介紹:https://testerhome.com/topics/2888

目前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,lifeng29@163.com'

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);
    return 0;
}

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);
    return 0;
}

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

 

 

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

locust中的測試腳本

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'among,lifeng29@163.com'

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中的檢查點。

執行方法,通過命令行啟動:
如下圖:

 

 

LR中的測試過程和結果

測試過程:
直接設置並發用戶數和加載方式,10個用戶並發,同時加載就可以了。

 

 

測試結果:
平均響應時間:

 

 

TPS:

 

 

事務:

 

 

Locust中的測試過程和結果

測試過程:
使用瀏覽器打開http://127.0.0.1:8089

 

設置需要的並發用戶數和用戶加載策略。
這里設置相同的10用戶並發,Hatch Rate是每秒啟動多少用戶的意思。這里設置為10,就是同時啟動10個了。注意,這里不好設置執行多久,和LR不一樣。(可以不啟動瀏覽器,直接在啟動參數中設置並發用戶數,執行多少個事務后結束,具體用-h可以看到幫助)

 

啟動執行后:

 

 

其中,Average中為平均響應時間等測試指標,最后一列的reqs/sec相當於LR中的TPS。(這里locust把它叫做rps),其他指標都比較好理解了。

 

最后的結果:
在web頁面中可以下載原始的測試結果數據。
在停掉python命令后,在終端中也可以看到一些信息,最后的一行是百分之X的響應時間,表示百分之多少的交易在XXX響應時間內。
這里比LR中的要多點,包括了50%到100%的響應時間。

 

 

結果比較

在相同的服務器端環境,測試的結果值相似,沒有多大的區別。
在設置交易比例的過程中,可以看到get和post交易的比例都存在差異。這個也無法避免(除非自己寫腳本划分)。所以tps方面存在些差異。不過總體差距很小。

總結

性能測試,重點是考察並發用戶數、響應時間、tps這類指標。

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

locust也可以支持分布式執行(多執行機),用來簡單測試這類http的接口,也算比較方便。
而且,locust全部基於Python腳本,擴展性不錯,號稱可以測試任何協議和系統。

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

歡迎大家討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM