jmeter-增加自定義函數(shù)【java】

場(chǎng)景:需要一個(gè)生成可用的身份證id的方法?!舅惴梢园俣人选?br> 模仿求和方法 ${__intSum(1,2,)}


/** 
 * 
 * 身份證算法實(shí)現(xiàn)
 * 
* 1、號(hào)碼的結(jié)構(gòu) 公民身份號(hào)碼是特征組合碼,
*     由十七位數(shù)字本體碼和一位校驗(yàn)碼組成。
* 排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼  三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼。 
* 
* 2、地址碼(前六位數(shù)) 表示編碼對(duì)象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。 
* 
* 3、出生日期碼(第七位至十四位) 表示編碼對(duì)象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。 
* 
* 4、順序碼(第十五位至十七位) 
*    表示在同一地址碼所標(biāo)識(shí)的區(qū)域范圍內(nèi),對(duì)同年、同月、同日出生的人編定的順序號(hào),順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。 
* 
* 5、校驗(yàn)碼(第十八位數(shù)) 
*   (1)十七位數(shù)字本體碼加權(quán)求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 
* ,先對(duì)前17位數(shù)字的權(quán)求和
*  Ai:表示第i位置上的身份證號(hào)碼數(shù)字值
*   Wi:表示第i位置上的加權(quán)因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 
* (2)計(jì)算模 Y = mod(S, 11) 
* (3)通過(guò)模得到對(duì)應(yīng)的校驗(yàn)碼 Y: 0 1 2 3 4 5 6 7  8 9 10 
*   校驗(yàn)碼: 1 0 X 9 8 7 6 5 4 3 2 
* 
* 
 */
  可以利用之前的jmeter請(qǐng)求java方法實(shí)現(xiàn)。但是考慮到j(luò)meter有
  自帶方法,所以準(zhǔn)備模仿添加一個(gè)自定義方法。

  百度上文章:都是說(shuō)把寫(xiě)好的方法打包成jar,放入jmeter的lib/ext目錄下,和java請(qǐng)求一樣。

  遇到問(wèn)題:自定義的方法,依賴jmeter的jar,把整個(gè)工程
  打包成jar放入jmeter目錄下,會(huì)有包的沖突【因?yàn)樾律傻膉ar包中已經(jīng)有jmeter的jar了,

  而且如果自定義方法多了,冗余嚴(yán)重】。

剛好想了解下jmeter源碼:于是就決定在jmter源碼基礎(chǔ)上增加方法

優(yōu)點(diǎn)是:1:直接利用jmeter的jar包,學(xué)習(xí)jmeter底層方法實(shí)現(xiàn)。
       2:了解jmeter最新特性
       3:不用每次寫(xiě)個(gè)方法或其他都要打包成jar放入jmeter的插件包中?。。。?

jmeter源碼github地址:https://github.com/apache/jmeter

準(zhǔn)備工作  :工具部分見(jiàn)百度!~     
               1:安裝git
               2:安裝ant
               3:安裝maven

git上文檔都是英文,大概意思如下(都是躺過(guò)的坑)

安裝依賴:在根目錄執(zhí)行
ant download_jars

寫(xiě)完代碼后,用過(guò)想啟動(dòng)jmeter【每次改完代碼后,如果要用執(zhí)行下面2個(gè)命令!?。。 ? ant
 jmeter

準(zhǔn)備就這么多了,具體步驟如下:

在工程目錄下 src.org.apache.jmeter.functions下
copy一個(gè)其他方法如求和方法,將execute 方法的返回值改為你想要的返回值即可。

具體需要注意的方法如下,copy別人的

擴(kuò)展AbstractFunction類

AbstractFunction類提供了4個(gè)抽象方法,在擴(kuò)展的時(shí)候需要實(shí)現(xiàn)他們。

public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException

JMeter會(huì)將上次運(yùn)行的SampleResult和當(dāng)前的Sampler作為參數(shù)傳入到該方法里,返回值就是在運(yùn)行該function后得到的值,以String類型返回。該方法如果操作了非線程安全的對(duì)象(比如文件),則需要將對(duì)該方法進(jìn)行線程同步保護(hù)。

public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException;

這個(gè)方法在用于傳遞用戶在執(zhí)行過(guò)程當(dāng)中傳入的實(shí)際參數(shù)值。該方法在function沒(méi)有參數(shù)情況下也會(huì)被調(diào)用。一般該方法傳入的參數(shù)會(huì)被保存在類內(nèi)全局變量里,并被后面調(diào)用的execute方法中使用到。

   public String getReferenceKey();

這個(gè)就是function的名字。JMeter的命名規(guī)則是在方法名前面加入雙下劃線"__"。比如"__GetEven",function的名字跟實(shí)現(xiàn)該類的類名應(yīng)該一致,而且該名字應(yīng)該以static final的方式在實(shí)現(xiàn)類中定義好,避免在運(yùn)行的時(shí)候更改它。

   public List<String> getArgumentDesc();

最后在你的實(shí)現(xiàn)類中還需要提供一個(gè)方法來(lái)告訴JMeter關(guān)于你實(shí)現(xiàn)的function的描述。

源代碼實(shí)現(xiàn)

實(shí)現(xiàn)的源代碼如下所示,重要的代碼已經(jīng)有注釋。


/**
 * Created by cxf on 2017/8/1.
 */
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.util.JMeterUtils;

public class GetIdCard extends AbstractFunction {
    //自定義function的描述
    private static final List<String> desc = new LinkedList<String>();
    static {
        desc.add(JMeterUtils.getResString("intsum_param_1")); //$NON-NLS-1$
        desc.add(JMeterUtils.getResString("intsum_param_2")); //$NON-NLS-1$
        desc.add(JMeterUtils.getResString("function_name_paropt")); //$NON-NLS-1$
    }

    //function名稱
    private static final String KEY = "_getIdCard";//你的方法名稱

    private static final int MAX_PARA_COUNT = 2;//參數(shù)做多2個(gè)
    private static final int MIN_PARA_COUNT = 0;//參數(shù)最少0個(gè)
    public GetIdCard() {
    }

    //傳入?yún)?shù)的值
   private Object[] values;


    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }

    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
        try {
//
             IdCardGenerator g = new IdCardGenerator();//單獨(dú)生成身份證的類
             String x=g.generate();//單獨(dú)生成身份證的方法
            if(x==null){
                return "ID is  null";
            }else{
                return "ID="+ g.generate();
            }


        } catch(Exception ex) {
            throw new InvalidVariableException(ex);
        }
    }

    @Override
    public String getReferenceKey() {
        return KEY;//你的方法名稱
    }

    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        checkParameterCount(parameters,MIN_PARA_COUNT,MAX_PARA_COUNT); //檢查參數(shù)的個(gè)數(shù)是否正確
        values = parameters.toArray(); //將值存入類變量中
    }

}
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 本文版權(quán)歸xmeter.net 所有。歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處。 簡(jiǎn)介### JMeter作為Apache的項(xiàng)目允...
    XMeter性能測(cè)試云服務(wù)閱讀 8,043評(píng)論 7 8
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,936評(píng)論 25 709
  • 在使用Jmeter進(jìn)行接口的性能測(cè)試時(shí),由于Jmeter 是JAVA應(yīng)用,對(duì)于CPU和內(nèi)存的消耗比較大,所以,當(dāng)需...
    燕京博士閱讀 4,300評(píng)論 0 16
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • Qt中與圖形界面相關(guān)常見(jiàn)的類. 標(biāo)簽 : Qt基礎(chǔ) [TOC] 1.幾個(gè)常用的類 1.1 QPainter cla...
    初心不忘丿閱讀 1,255評(píng)論 0 2

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