概述
本文介紹在利用JMeter進行擴展插件,利用JMeter提供的組件的時候碰到的問題狡逢,讀者如果碰到有類似的問題拼卵,通過閱讀此篇文章腋腮,避免在使用JMeter提供的UI組件的時候浪費寶貴的時間。
問題描述
xmeter君最近在擴展JMeter插件的時候徊哑,需要有一個界面允許測試人員來開發(fā)測試腳本聪富,而通過JMeter來擴展界面的時候,使用JMeter提供的一些組件能讓開發(fā)人員提高效率窒盐,減少重復(fù)造輪子的時間蟹漓。JMeter提供的一些內(nèi)置的可重用的UI組件一般都在*.gui包中源内,比如用于布局的各種layout在core目錄的/org/apache/jmeter/gui/util包,比如HorizontalPanel嗽交,允許加入該Panel的組件以水平布局的方式加到界面中颂斜;又比如說JLabeledTextField,該控件主要用于顯示一個Label和TextField的組合盒让,使用該組件可以減少生成UI過程中的代碼量(如果讀者想設(shè)置JMeter的開發(fā)環(huán)境,可以參考xmeter君寫的這篇文章 )姨蝴。
如下圖所示左医,xmeter君要開發(fā)的這個插件的需求如下同木。編輯腳本的人員在選擇“Functions”下拉列表框的時候,綠色部分的組件是動態(tài)變化的:如果當前選擇的是add秕硝,那么下面出現(xiàn)的帶有兩個輸入?yún)?shù)的控件組合斩萌;如果當前的選擇變成了另外的屏轰,那么綠色部分的組件就會發(fā)生變化颊郎。其中綠色部分的是一個Panel,每個參數(shù)(下圖為num1和num2)會單獨生成一個Panel霎苗,并加入綠色的Panel中姆吭。
那今天要說的這個控件的名字就是上文提到的綠色的Panel,使用的是由JMeter提供的HorizontalPanel唁盏。在用戶選擇的Functions有變化之后内狸,代碼的大概邏輯如下,
1)監(jiān)聽到用戶選擇的Functions有變化
2)刪除綠色Panel下的所有控件
3)根據(jù)新選擇的Function厘擂,生成新的針對參數(shù)的Panel昆淡,并加到綠色的Panel中
4)重繪綠色Panel
但是實際上使用JMeter提供的HorizontalPanel后效果如下,可以看到在每次用戶更改了一次選擇之后刽严,都會“遺留”下一部分內(nèi)容(下圖藍色和紅色是對Panel的border進行著色,這樣更易于理解)舞萄≌2梗看起來是調(diào)用HorizontalPanel的刪除子組件的方法不能完全刪除干凈引起的。
查看HorizontalPanel的源代碼倒脓,在add方法中發(fā)現(xiàn)了問題所在撑螺,特別是注釋中寫的:“這個方法在調(diào)用remove的時候會有坑,但是目前這個坑還暫時碰不到崎弃,所以先不管它了”甘晤『耍可是在xmeter君使用該控件的時候,很不幸踩到了這個坑安皱。由于調(diào)用HorizontalPanel的刪除組件的方法并不會清除在該組件中定義的另外一個容器組件(subPanel)调鬓,因此導致在調(diào)用刪除子組件方法的時候不斷有東西被遺留下來。
/**
* {@inheritDoc}
*/
@Override
public Component add(Component c) {
????// This won't work right if we remove components. But we don't, so I'm
????// not going to worry about it right now.
????if (hgap > 0 && subPanel.getComponentCount() > 0) {
????????subPanel.add(Box.createHorizontalStrut(hgap));
????}
????if (c instanceof JComponent) {
????????((JComponent) c).setAlignmentY(verticalAlign);
????}
????return subPanel.add(c);
}
解決方法
找到問題的根源之后酌伊,解決起來就比較簡單了腾窝。自己定義一個新的類CustomHorizontalPanel,其它的方法參考JMeter中HorizontalPanel提供的實現(xiàn)居砖,再新增一個方法用于刪除容器組件(subPanel)的子組件虹脯。在刪除上文所說的綠色Panel中的子組件的時候,調(diào)用removeSubs方法奏候,這樣避免了調(diào)用父類繼承的remove方法帶來的上述問題循集。
public void removeSubs() {
????subPanel.removeAll();
}
參考資料
JMeter擴展插件實現(xiàn)對自定義協(xié)議進行支持 ,該文章描述了自定義JMeter插件的基本流程蔗草,包括UI和模型(Sampler的實現(xiàn))等咒彤。