腳本增強
面對較復雜的測試場景,我們可能還是會感覺無從下手;例如,很多時候腳本需要做關聯或參數化處理,Locust中就不知道怎么實現了。可能也是這方面的原因,感覺難以將Locust應用到實際的性能測試工作當中。其實這也跟Locust的目標定位有關,Locust的定位就是small and very hackable。但是小巧並不意味着功能弱,我們完全可以通過Python腳本本身來實現各種各樣的功能。
在LoadRunner這款功能全面應用廣泛的商業性能測試工具中,腳本增強無非就涉及到四個方面:
· 關聯
· 參數化
· 檢查點
· 集合點
a.關聯:在某些請求中,需要攜帶之前從Server端返回的參數,因此在構造請求時需要先從之前請求的Response中提取出所需的參數,常見場景就是session_id。針對這種情況,LoadRunner手動進行關聯處理時,主要是通過使用注冊型函數,例如web_reg_save_param,對前一個請求的響應結果進行解析,根據左右邊界或其它特征定位到參數值並將其保存到參數變量,然后在后續請求中使用該參數。采用同樣的思想,我們在Locust腳本中也完全可以實現同樣的功能,畢竟只是Python腳本,通過官方庫函數re.search就能實現所有需求。甚至針對html頁面,我們也可以采用lxml庫,通過etree.HTML(html).xpath來更優雅地實現元素定位。
b.參數化:這一項極其普遍,主要是用在測試數據方面,其實也可以概括為三種類型。
· 循環取數據,數據可重復使用:e.g. 模擬3用戶並發請求網頁,總共有100個URL地址,每個虛擬用戶都會依次循環加載這100個URL地址;
· 保證並發測試數據唯一性,不循環取數據:e.g. 模擬3用戶並發注冊賬號,總共有90個賬號,要求注冊賬號不重復,注冊完畢后結束測試;
· 保證並發測試數據唯一性,循環取數據:模擬3用戶並發登錄賬號,總共有90個賬號,要求並發登錄賬號不相同,但數據可循環使用。
以上三種類型基本上可以覆蓋我們日常性能測試工作中的所有參數化場景。
使用Python的list和queue數據結構即可!具體做法是,在WebsiteUser定義一個數據集,然后所有虛擬用戶在WebsiteTasks中就可以共享該數據集了。如果不要求數據唯一性,數據集選擇list數據結構,從頭到尾循環遍歷即可;如果要求數據唯一性,數據集選擇queue數據結構,取數據時進行queue.get()操作即可,並且這也不會循環取數據;至於涉及到需要循環取數據的情況,那也簡單,每次取完數據后再將數據插入到隊尾即可,queue.put_nowait(data)
c.檢查點
在Locust腳本中,只需要對響應的內容關鍵字進行assert xxx in response操作即可。
Locust運行模式
運行Locust時,通常會使用到兩種運行模式:單進程運行和多進程分布式運行。
單進程運行模式的意思是,Locust所有的虛擬並發用戶均運行在單個Python進程中,具體從使用形式上,又分為no_web和web兩種形式。該種模式由於單進程的原因,並不能完全發揮壓力機所有處理器的能力,因此主要用於調試腳本和小並發壓測的情況。當並發壓力要求較高時,就需要用到Locust的多進程分布式運行模式。從字面意思上看,可能第一反應就是多台壓力機同時運行,每台壓力機分擔負載一部分的壓力生成。的確,Locust支持任意多台壓力機(一主多從)的分布式運行模式,但這里說到的多進程分布式運行模式還有另外一種情況,就是在同一台壓力機上開啟多個slave的情況。這是因為當前階段大多數計算機的CPU都是多處理器(multiple processor cores),單進程運行模式下只能用到一個處理器的能力,而通過在一台壓力機上運行多個slave,就能調用多個處理器的能力了。比較好的做法是,如果一台壓力機有N個處理器內核,那么就在這台壓力機上啟動一個master,N個slave。當然,我們也可以啟動N的倍數個slave,但是根據我的試驗數據,效果跟N個差不多,因此只需要啟動N個slave即可。
腳本調試
Locust腳本編寫完畢后,在正式開始性能測試之前還需要先調試運行下。
不過,Locust腳本雖然為Python腳本,但卻很難直接當做Python腳本運行起來,主要還是因為Locust腳本中引用了HttpLocust和TaskSet這兩個類,如果要想直接對其進行調用測試,會發現編寫啟動腳本是一個比較困難的事情。因為這個原因,剛接觸Locust的同學可能就會覺得Locust腳本不好調試。
但這個問題也能克服,那就是借助Locust的單進程no_web運行模式。
在Locust的單進程no_web運行模式中,我們可以通過--no_web參數,指定並發數(-c)和總執行次數(-n),直接在Terminal中執行腳本。
在此基礎上,當我們想要調試Locust腳本時,就可以在腳本中需要調試的地方通過print打印日志,然后將並發數和總執行次數都指定為1,執行形式如下所示。
$ locust -f locustfile.py --no_web -c 1 -n 1
通過這種方式,我們就能很方便地對Locust腳本進行調試了
執行測試
Locust腳本調試通過后,就算是完成了所有准備工作,可以開始進行壓力測試了。Locust是通過在Terminal中執行命令進行啟動的,通用的參數有如下兩個:
· -H, --host:被測系統的host,若在Terminal中不進行指定,就需要在Locust子類中通過host參數進行指定;
· -f, --locustfile:指定執行的Locust腳本文件;
除了這兩個通用的參數,我們還需要根據實際測試場景,選擇不同的Locust運行模式,而模式的指定也是通過其它參數來進行控制的
單進程運行
no_web
如果采用no_web形式,則需使用--no-web參數,並會用到如下幾個參數。
· -c, --clients:指定並發用戶數;
· -n, --num-request:指定總執行測試;
· -r, --hatch-rate:指定並發加壓速率,默認值位1。
web
如果采用web形式,,則通常情況下無需指定其它額外參數,Locust默認采用8089端口啟動web;如果要使用其它端口,就可以使用如下參數進行指定。
· -P, --port:指定web端口,默認為8089.
此時,Locust並沒有開始執行測試,還需要在Web頁面中配置參數后進行啟動。
如果Locust運行在本機,在瀏覽器中訪問http://localhost:8089即可進入Locust的Web管理頁面;如果Locust運行在其它機器上,那么在瀏覽器中訪問http://locust_machine_ip:8089即可。
在Locust的Web管理頁面中,需要配置的參數只有兩個:
· Number of users to simulate: 設置並發用戶數,對應中no_web模式的-c, --clients參數;
· Hatch rate (users spawned/second): 啟動虛擬用戶的速率,對應着no_web模式的-r, --hatch-rate參數。
參數配置完畢后,點擊【Start swarming】即可開始測試
多進程分布式運行
不管是單機多進程,還是多機負載模式,運行方式都是一樣的,都是先運行一個master,再啟動多個slave。
啟動master時,需要使用--master參數;同樣的,如果要使用8089以外的端口,還需要使用-P, --port參數。
master啟動后,還需要啟動slave才能執行測試任務。
啟動slave時需要使用--slave參數;在slave中,就不需要再指定端口了
如果slave與master不在同一台機器上,還需要通過--master-host參數再指定master的IP地址。
master和slave都啟動完畢后,就可以在瀏覽器中通過http://locust_machine_ip:8089進入Locust的Web管理頁面了。使用方式跟單進程web形式完全相同,只是此時是通過多進程負載來生成並發壓力,在web管理界面中也能看到實際的slave數量
測試結果展示
在執行測試的過程中,我們可以在web界面中實時地看到結果運行情況。
Locust的結果展示十分簡單,主要就四個指標:並發數、RPS、響應時間、異常率。但對於大多數場景來說,這幾個指標已經足夠。
以上這些原理的學習均來自大牛博客,講解很透徹,重要的是自己要動手實踐,技術性的東西看原理是記不住的,需要練手。地址https://blog.csdn.net/lizzy05/article/details/70792702