Jmeter Function解讀

Jmeter 函數(shù)助手提供了一系列功能,比如csv參數(shù)文件讀取、Md5加密等等,工作上可能會(huì)遇到其他jmeter尚未實(shí)現(xiàn)的功能,為了更簡(jiǎn)便的完成工作,可以選擇擴(kuò)展Jmeter

函數(shù)助手

org.apache.jmeter.functions 是jmeter擴(kuò)展功能包,所有擴(kuò)展需位于此包中

image.png

Jmeter擴(kuò)展AbstractFunction類

抽象類AbstractFunction包括四個(gè)抽象方法,需要在類中分別實(shí)現(xiàn)

//參數(shù)值設(shè)置,根據(jù)定義的參數(shù)名稱獲取對(duì)應(yīng)的參數(shù)值,保存在JMeterUtils全局變量中
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException;
//函數(shù)名稱,比如_CSVRead
public String getReferenceKey();
/*根據(jù)兩個(gè)入?yún)?,獲取擴(kuò)展函數(shù)的<String>類型結(jié)果值。
SampleResult 上一個(gè)Sampler的結(jié)果,Sampler當(dāng)前運(yùn)行Sampler。*/
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException;
//函數(shù)助手界面顯示函數(shù)定義
public List<String> getArgumentDesc()

基于源碼解讀

通過_Random功能源碼分析具體實(shí)現(xiàn)

_Random


package org.apache.jmeter.functions;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils;

/**
 * Provides a Random function which returns a random long integer between a min
 * (first argument) and a max (second argument).
 * @since 1.9
 */
public class Random extends AbstractFunction {

    private static final List<String> desc = new LinkedList<>();
    //定義函數(shù)名稱
    private static final String KEY = "__Random"; //$NON-NLS-1$
   //初始化代碼塊定義函數(shù)名稱
    static {
        desc.add(JMeterUtils.getResString("minimum_param")); //$NON-NLS-1$
        desc.add(JMeterUtils.getResString("maximum_param")); //$NON-NLS-1$
        desc.add(JMeterUtils.getResString("function_name_paropt")); //$NON-NLS-1$
    }
    //定義CompoundVariable 變量
    private CompoundVariable varName; 
    private CompoundVariable minimum;
    private CompoundVariable maximum;

    /**
     * No-arg constructor.
     */
    public Random() {
    }

    /** {@inheritDoc} 
    具體實(shí)現(xiàn)代碼
   */
    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler)
            throws InvalidVariableException {


        long min = Long.parseLong(minimum.execute().trim());
        long max = Long.parseLong(maximum.execute().trim());

        long rand = ThreadLocalRandom.current().nextLong(min, max+1);
        //計(jì)算得到結(jié)果隨機(jī)數(shù)
        String randString = Long.toString(rand);
      /**
     結(jié)果保存到JMeterVariables 并發(fā)線程組參數(shù)中,可以函數(shù)名稱的方式調(diào)用
     */
        if (varName != null) {

            JMeterVariables vars = getVariables();
            final String varTrim = varName.execute().trim();
            if (vars != null && varTrim.length() > 0){// vars will be null on TestPlan
              //put方法,key/value類型,可使用${varTrim}方式獲取randString值
                vars.put(varTrim, randString);
            }
        }

        return randString;

    }

    /** {@inheritDoc} 
   參數(shù)值獲取,以及參數(shù)檢查
     */
    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        //檢查參數(shù)數(shù)量是否設(shè)置正確
        checkParameterCount(parameters, 2, 3);
        Object[] values = parameters.toArray();
        //獲取具體參數(shù)值
        minimum = (CompoundVariable) values[0];
        maximum = (CompoundVariable) values[1];
        if (values.length>2){
            varName = (CompoundVariable) values[2];
        } else {
            varName = null;
        }

    }

    /** {@inheritDoc} 
   返回?cái)U(kuò)展函數(shù)名稱
   */
    @Override
    public String getReferenceKey() {
        return KEY;
    }

    /** {@inheritDoc} 
 函數(shù)助手界面展示  
 */
    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }

}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,291評(píng)論 4 61
  • 一天,看和菜頭的早期文章,里面提到了一本書,名曰《如何讀一本書》。書名大概是這樣,也不排除我的記憶有不確切的地方。...
    遠(yuǎn)方的河閱讀 510評(píng)論 0 5
  • 字符串的拓展 1.ES6為字符串添加了遍歷器接口,因此可以使用for...of循環(huán)遍歷字符串 2.字符串新增的 i...
    Cryptic閱讀 1,276評(píng)論 3 11
  • 今天把之前沒讀的專欄讀了,《你為什么總是半途而廢》,其實(shí)可以用一句話解讀那周專欄的內(nèi)容: 半途而廢是因?yàn)闆]有給事情...
    元能力閱讀 320評(píng)論 0 1

友情鏈接更多精彩內(nèi)容