最近本身開發了一個小的接口,功能測完了,忽然想測下性能,原來作性能測試,我一直用的是HP的LoadRunner,前一段時間正好看過locust,想一想就用這個來測測性能吧。
因爲對LR比較熟,正好作個對比,這樣更利於對新東西的理解。html
locust 的官網:http://locust.io/python
也能夠參考論壇裏其餘同窗的介紹:https://testerhome.com/topics/2888web
目前locust還只支持Python 2版本。shell
驗證在相同的服務器端的狀況下,使用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端口。markdown
在另外的一個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:app
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中的執行方法,直接放到場景中,執行便可。
在另外的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
具體的參數能夠查看官方文檔。
其中:
執行方法,經過命令行啓動:
以下圖:
測試過程:
直接設置併發用戶數和加載方式,10個用戶併發,同時加載就能夠了。
測試結果:
平均響應時間:
TPS:
事務:
測試過程:
使用瀏覽器打開http://127.0.0.1:8089
啓動執行後:
最後的結果:
在web頁面中能夠下載原始的測試結果數據。
在停掉python命令後,在終端中也能夠看到一些信息,最後的一行是百分之X的響應時間,表示百分之多少的交易在XXX響應時間內。
這裏比LR中的要多點,包括了50%到100%的響應時間。
在相同的服務器端環境,測試的結果值類似,沒有多大的區別。
在設置交易比例的過程當中,能夠看到get和post交易的比例都存在差別。這個也沒法避免(除非本身寫腳本劃分)。因此tps方面存在些差別。不過整體差距很小。
性能測試,重點是考察併發用戶數、響應時間、tps這類指標。
一直用的是LR,LR在一塊兒概念上更易於理解,在有lr的基礎上,在看其餘的工具,就比較容易了。
locust也能夠支持分佈式執行(多執行機),用來簡單測試這類http的接口,也算比較方便。
並且,locust所有基於Python腳本,擴展性不錯,號稱能夠測試任何協議和系統。
最後,我仍是那句話,看什麼事情,用什麼工具最高效易用,用合適的工具作合適的事情便可。
歡迎你們討論。