場(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(); //將值存入類變量中
}
}