概述
- 在一些企業(yè)中,各類業(yè)務(wù)系統(tǒng)非常豐富,相互之間或?qū)ν馓峁┖芏嗟姆?wù)或接口
- 這些服務(wù)或接口中,有很多是需要強(qiáng)契約約束的,服務(wù)的提供方、服務(wù)的使用方必須遵守相同契約
- 這類服務(wù)最典型的就是RPC,其中應(yīng)用廣泛的有Dubbo、gRPC等
- 使用JMeter對(duì)這些RPC接口的測(cè)試,可以自定義插件來(lái)實(shí)現(xiàn)
- 由于Dubbo應(yīng)用相對(duì)廣泛,本文主要針對(duì)Dubbo的接口測(cè)試插件開(kāi)發(fā)與實(shí)現(xiàn)進(jìn)行介紹
需要掌握的基礎(chǔ)知識(shí)
- Java基礎(chǔ)技術(shù),像Java基礎(chǔ)知識(shí)、面向?qū)ο?、Maven等
- Swing,Java基礎(chǔ)的圖形化技術(shù),就要用于JMeter組件的界面元件繪制
- JMeter常用組件,包括使用和對(duì)應(yīng)的類、方法,比較典型的配置元件、取樣器
- Dubbo,要掌握Dubbo的原理、開(kāi)發(fā)、部署及調(diào)用規(guī)則,才能較好的進(jìn)行JMeter插件的開(kāi)發(fā);尤其是要了解****Dubbo泛化調(diào)用的編程。
開(kāi)發(fā)步驟
1、開(kāi)發(fā)配置元件(Config Element)
主要配置Dubbo注冊(cè)服務(wù)地址(一般是Zookepper、Nacos等),超時(shí)時(shí)間等一些通用配置
繼承AbstractConfigGui類,在此類中實(shí)現(xiàn)一系列方法,使用Swing繪制界面、并將界面輸入框內(nèi)容保存到JMeter全局?jǐn)?shù)據(jù),具體如下:
getStaticLabel方法,用于返回配置元件名稱,示例代碼如下:
@Override
public String getStaticLabel() {
return "Dubbo基礎(chǔ)配置";
}
getLabelResource方法,獲取組件資源名稱,用于多語(yǔ)言,可忽略,示例代碼如下:
@Override
public String getLabelResource() {
return this.getClass().getSimpleName();
}
configure方法,將測(cè)試元件屬性值設(shè)置回圖形化組件,示例代碼如下:
@Override
public void configure(TestElement element) {
super.configure(element);
//將配置值設(shè)置回當(dāng)前Swing組件
if (element instanceof ConfigTestElement) {
ConfigTestElement configTestElement = (ConfigTestElement) element;
this.txtDubboAddress.setText(configTestElement.getPropertyAsString(DUBBO_ADDRESS_KEY));
this.txtNamespace.setText(configTestElement.getPropertyAsString(NAMESPACE_KEY));
this.txtGroup.setText(configTestElement.getPropertyAsString(GROUP_KEY));
this.txtProtocol.setText(configTestElement.getPropertyAsString(PROTOCOL_KEY));
this.txtTimeout.setText(configTestElement.getPropertyAsString(TIMEOUT_KEY));
}
}
createTestElement方法,創(chuàng)建測(cè)試元件對(duì)象,該對(duì)象屬性值會(huì)在測(cè)試計(jì)劃或線程組內(nèi)共享,示例代碼如下:
@Override
public TestElement createTestElement() {
//創(chuàng)建測(cè)試元件對(duì)象,該對(duì)象的屬性值會(huì)在測(cè)試計(jì)劃或線程組內(nèi)共享
ConfigTestElement configTestElement = new ConfigTestElement();
//修改測(cè)試元件對(duì)象
modifyTestElement(configTestElement);
return configTestElement;
}
modifyTestElement方法,修改測(cè)試元件對(duì)象,主要是將Swing組件輸入的值保存到測(cè)試元件對(duì)象,示例代碼如下:
@Override
public void modifyTestElement(TestElement testElement) {
super.configureTestElement(testElement);
//將Swing組件輸入的值保存到測(cè)試元件
testElement.setProperty(DUBBO_ADDRESS_KEY,this.txtDubboAddress.getText());
testElement.setProperty(NAMESPACE_KEY,this.txtNamespace.getText());
testElement.setProperty(GROUP_KEY,this.txtGroup.getText());
testElement.setProperty(PROTOCOL_KEY,this.txtProtocol.getText());
testElement.setProperty(TIMEOUT_KEY,this.txtTimeout.getText());
}
clearGui方法,清理圖形化界面,示例代碼如下:
@Override
public void clearGui() {
super.clearGui();
//設(shè)置圖形化界面組件初始值
this.initGuiValues();
}
2、開(kāi)發(fā)取樣器(Sampler)
主要配置單個(gè)Dubbo接口測(cè)試用例的獨(dú)特配置,包括接口地址、請(qǐng)求參數(shù)、響應(yīng)數(shù)據(jù)處理等
分別繼承自AbstractSampler、AbstractSamplerGui抽象類,使用Swing繪制界面、并將界面輸入框內(nèi)容保存到JMeter全局?jǐn)?shù)據(jù)
重寫(xiě)父類AbstractSampler邏輯和方法
定義與界面相關(guān)的取樣器數(shù)據(jù)緩存Key,示例代碼如下:
/**
* 服務(wù)接口屬性Key,用于與DubboSamplerGui共享輸入的文本值
*/
public static final String INTERFACE_KEY = "interface_key";
sample方法,執(zhí)行取樣器,示例代碼如下
public class DubboSampler extends AbstractSampler{
//1、定義取樣器返回對(duì)象
SampleResult sampleResult = new SampleResult();
//2、設(shè)置取樣器標(biāo)題
sampleResult.setSampleLabel(this.getPropertyAsString("TestElement.name"));
//3、開(kāi)始取樣
sampleResult.sampleStart();
//4、從GUI獲取輸入值,獲取從DubboSamplerGui傳遞過(guò)來(lái)的輸入值
String inf = this.getPropertyAsString(INTERFACE_KEY);
//...
//5、加工輸入數(shù)據(jù),使用輸入數(shù)據(jù)構(gòu)造業(yè)務(wù)數(shù)據(jù)
DubboInvokeEntity dubboInvokeEntity = new DubboInvokeEntity();
//...
//6、執(zhí)行或調(diào)用自定義的業(yè)務(wù)邏輯
Object result = DubboInvokeUtil.invoke(dubboInvokeEntity);
//7、將業(yè)務(wù)邏輯返回值設(shè)置到返回對(duì)象
sampleResult.setResponseData(JSON.toJSONString(result), StandardCharsets.UTF_8.name());
//8、結(jié)束并返回
sampleResult.setDataType(SampleResult.TEXT);
//結(jié)束取樣器
sampleResult.sampleEnd();
//標(biāo)識(shí)為成功
sampleResult.setSuccessful(true);
return sampleResult;
}
重寫(xiě)父類AbstractSamplerGui邏輯與方法
定義Swing組件引用,定義與界面相關(guān)的Swing組件,可選,示例代碼如下:
/**
* 接口名稱文本框
*/
private JTextField txtInterface;
//...,多個(gè)Swing組件,可進(jìn)行類似定義
構(gòu)造方法,進(jìn)行界面和默認(rèn)值的初始化,示例代碼如下:
public DubboSamplerGui(){
super();
//初始化圖形化界面
this.initGui();
//初始化圖形化界面默認(rèn)值
this.initGuiValues();
}
getStaticLabel方法,定義取樣器名稱,示例代碼如下:
@Override
public String getStaticLabel() {
return "Dubbo請(qǐng)求";
}
getLabelResource方法,定義組件資源名稱,一般用于多語(yǔ)言資源,使用默認(rèn)實(shí)現(xiàn),示例代碼如下:
@Override
public String getLabelResource() {
return this.getClass().getSimpleName();
}
configure方法,配置方法,將測(cè)試元件取樣器緩存的屬性值設(shè)置回圖形化組件,示例代碼如下:
@Override
public void configure(TestElement element) {
super.configure(element);
if (element instanceof DubboSampler) {
//將Sampler的數(shù)據(jù)回寫(xiě)GUI,因?yàn)橐粋€(gè)測(cè)試任務(wù)下有多個(gè)GUI,使用不同的Sampler
DubboSampler sampler = (DubboSampler) element;
this.txtInterface.setText(sampler.getPropertyAsString(DubboSampler.INTERFACE_KEY));
//...
}
}
createTestElement方法,創(chuàng)建測(cè)試元件對(duì)象,該對(duì)象的屬性值會(huì)在測(cè)試計(jì)劃或線程組內(nèi)共享,示例代碼如下:
@Override
public TestElement createTestElement() {
//創(chuàng)建測(cè)試元件對(duì)象,該對(duì)象的屬性值會(huì)在測(cè)試計(jì)劃或線程組內(nèi)共享
DubboSampler dubboSampler = new DubboSampler();
//修改測(cè)試元件對(duì)象
this.modifyTestElement(dubboSampler);
return dubboSampler;
}
modifyTestElement方法,修改測(cè)試元件對(duì)象,主要是將Swing組件輸入的值保存到測(cè)試對(duì)象,示例代碼如下:
@Override
public void modifyTestElement(TestElement testElement) {
//配置取樣器對(duì)象
super.configureTestElement(testElement);
if (testElement instanceof DubboSampler) {
DubboSampler dubboSampler = (DubboSampler) testElement;
//將Swing組件輸入的值保存到測(cè)試元件
dubboSampler.setProperty(DubboSampler.INTERFACE_KEY,this.txtInterface.getText());
//...
}
}
clearGui方法,清理圖形化界面,示例代碼如下:
@Override
public void clearGui() {
super.clearGui();
//設(shè)置圖形化界面組件初始值
this.initGuiValues();
}
initGui方法,自定義方法,主要是使用Swing組織取樣器的界面元素,示例代碼如下:
private void initGui(){
//使用面板等對(duì)構(gòu)造第1步定義的Swing組件,進(jìn)行合理布局
//...
}
initGuiValues方法,初始化圖形化界面Swing輸入組件默認(rèn)值,示例代碼如下:
private void initGuiValues() {
this.txtInterface.setText("com.lemon.demo.dubbo.inf.service.IUserService");
//...
}
3、在JMeter中使用
將開(kāi)發(fā)項(xiàng)目打包的.jar包拷貝到JMeter的lib/ext目錄
重新啟動(dòng)JMeter
在配置元件、取樣器中將會(huì)發(fā)現(xiàn)Dubb基礎(chǔ)配置、Dubbo請(qǐng)求兩個(gè)插件
效果
總體效果
配置元件效果
取樣器效果
最后感謝每一個(gè)認(rèn)真閱讀我文章的人,禮尚往來(lái)總是要有的,雖然不是什么很值錢(qián)的東西,如果你用得到的話可以直接拿走:
軟件測(cè)試面試小程序
被百萬(wàn)人刷爆的軟件測(cè)試題庫(kù)?。?!誰(shuí)用誰(shuí)知道?。?!全網(wǎng)最全面試刷題小程序,手機(jī)就可以刷題,地鐵上公交上,卷起來(lái)!
涵蓋以下這些面試題板塊:
1、軟件測(cè)試基礎(chǔ)理論 ,2、web,app,接口功能測(cè)試 ,3、網(wǎng)絡(luò) ,4、數(shù)據(jù)庫(kù)?,5、linux
6、web,app,接口自動(dòng)化 ,7、性能測(cè)試?,8、編程基礎(chǔ),9、hr面試題 ,10、開(kāi)放性測(cè)試題,11、安全測(cè)試,12、計(jì)算機(jī)基礎(chǔ)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-703819.html
這些資料,對(duì)于【軟件測(cè)試】的朋友來(lái)說(shuō)應(yīng)該是最全面最完整的備戰(zhàn)倉(cāng)庫(kù),這個(gè)倉(cāng)庫(kù)也陪伴上萬(wàn)個(gè)測(cè)試工程師們走過(guò)最艱難的路程,希望也能幫助到你!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-703819.html
到了這里,關(guān)于【JMeter】 二次開(kāi)發(fā)插件開(kāi)發(fā) Dubbo 接口測(cè)試插件淺析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!