背景及思路:
需求:要做 創(chuàng)建新卡 接口的測(cè)試,要求:
1. 不需要每次手動(dòng)修改請(qǐng)求參數(shù)岖常。
方案:文中先用excle將數(shù)據(jù)準(zhǔn)備好具伍,導(dǎo)出為csv格式燥狰,再用jmeter的csv請(qǐng)求進(jìn)行參數(shù)化
2. 卡號(hào)需要唯一;
方案:文中用jmeter的beanshell按時(shí)間戳加隨機(jī)數(shù)生成
3. 請(qǐng)求參數(shù)中有一個(gè)參數(shù)捕儒,會(huì)根據(jù)相應(yīng)的請(qǐng)求參數(shù)生成(文中的sign值)冰啃,接口請(qǐng)求會(huì)驗(yàn)證sign是否和相應(yīng)請(qǐng)求參數(shù)對(duì)應(yīng);
方案:
1. 文中將生成sign的源碼打包放在jmeter的lib\ext\ 下,
2. 再用jmeter的beanshell引用jar包刘莹,
3. 用同樣的規(guī)則生成sign保證其一致性阎毅。
-----下面正式開始實(shí)戰(zhàn)------:
-
將生成驗(yàn)簽的java源碼生成jar包,并將jar包放置在 \lib\ext目錄下
1.1 將生成sign規(guī)則的java類 打jar包 包路徑:com.util.lt
1.2 選擇JAR file
1.3 放置在jmeter的 lib\ext\下面 取名為 AppLoginUtils
1.4 如果對(duì)路徑不熟悉的話点弯,可以將剛剛生成的jar包放在D盤扇调, 解壓,查看目錄路徑
進(jìn) META-INF
-----至此---java生成jar包并放在jmeter相應(yīng)目錄準(zhǔn)備工作做好了.-----
-
參數(shù)化 excle 準(zhǔn)備數(shù)據(jù)
2.1 excle 列出個(gè)參數(shù)及值
2.2 另存為csv格式
2.3 用文本編輯器(如:editplus)打開文本抢肛,第一行為參數(shù)名狼钮,下面為參數(shù),剪切第一行數(shù)據(jù)為jmeter csv參數(shù)行捡絮,實(shí)際數(shù)據(jù)去掉第一行數(shù)據(jù)
-------------至此----測(cè)試參數(shù)準(zhǔn)備好了.----------------
-
jmeter 開始進(jìn)行測(cè)試 添加線程組
3.1 jmeter設(shè)置csv參數(shù) variableNames行數(shù)據(jù)為上面剪切的第一行數(shù)據(jù)
3.2 BeanShell PreProcessor 添加腳本生成需要的信息字段(生成cardNo為時(shí)間戳唯一數(shù) 為后續(xù)生成sign做準(zhǔn)備)
腳本如下:
import java.sql.Date;
import java.text.SimpleDateFormat;
Long timeStamp = System.currentTimeMillis(); //獲取當(dāng)前時(shí)間戳
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss"); //定義時(shí)間格式
String timeNow = sdf.format(new Date(timeStamp)); // 時(shí)間戳轉(zhuǎn)換成定義好的時(shí)間格式
//(數(shù)據(jù)類型)(最小值+Math.random()*(最大值-最小值+1))
//從1到9999的int型隨機(jī)數(shù)
String cardNo = timeNow + (int)(1+Math.random()*(9999-1+1));
//vars.get("name"); 從jmeter中獲得變量值
//vars.put("key","value"); 數(shù)據(jù)存到j(luò)meter變量中
vars.put("cardNo",cardNo); //將生成的當(dāng)前時(shí)間加隨機(jī)數(shù)生成的唯一字符串保存到j(luò)emter變量cardNo中
log.info("------------日志開始----------------");
log.info("cardNo is:"+cardNo);
log.info("------------日志結(jié)束----------------");
3.3 BeanShell PreProcessor 調(diào)用jar包的方法 生成sign值
同上添加 BeanShell PreProcessor 步驟燃领,
腳本如下:
import java.util.*;
import com.util.lt.AppLoginUtils;
public static getSign(String cardNo){
Map paras = new HashMap();
//取出剛剛csv參數(shù)化的數(shù)據(jù),放到map中
paras.put("sex",vars.get("sex"));
paras.put("xxx", vars.get("xxx"));
paras.put("xxxx", vars.get("xxxx"));
paras.put("xxxxx", vars.get("xxxxx"));
paras.put("type",vars.get("type"));
paras.put("operator", vars.get("operator"));
paras.put("cardNo",cardNo); //傳參
paras.put("codeName", vars.get("codeName"));
paras.put("operatorName", vars.get("operatorName"));
paras.put("xxxxxx", vars.get("xxxxxx"));
//調(diào)用 上面java打包的 生成驗(yàn)簽碼的方法
String sign = AppLoginUtils.getParametersToString(paras,"xxxxxxxxxxxxxxxxxxxxxxx");
vars.put("sign",sign); //將生成的sign存到j(luò)meter變量sign中锦援,供后續(xù)請(qǐng)求用
return sign;
}
//vars.get("name"); 從jmeter中獲得變量值
//vars.put("key","value"); 數(shù)據(jù)存到j(luò)meter變量中
log.info("------------日志開始----------------");
//下面供調(diào)試使用 使用上面 beanshell生成的 cardNo作為請(qǐng)求參數(shù) 以此保證使用的是一套數(shù)據(jù)
log.info("sign is:"+ getSign("${cardNo}"));
log.info("------------日志結(jié)束----------------");
3.4 http請(qǐng)求 輸入相應(yīng)的地址 端口號(hào) 路徑 編碼格式
3.4.1 parameters請(qǐng)求信息形式:
3.4.2 或者用 bodydata請(qǐng)求信息形式(與上面的請(qǐng)求形式二選一 其中一個(gè)可以右鍵--禁用):
3.5 添加 debug sample 進(jìn)行測(cè)試調(diào)試用 (可不用添加)
3.6 添加監(jiān)控器 查看結(jié)果樹 聚合報(bào)告:
3.6.1監(jiān)測(cè)的請(qǐng)求:
3.6.2 監(jiān)測(cè)的返回:
3.6.3 監(jiān)測(cè)的 debug Sample:
-------至此----一個(gè)完整的調(diào)用和監(jiān)控結(jié)束了.-------
接下來是 在做的過程中的一些注意點(diǎn):
一. 怎么調(diào)試:
1.可以用beanShellSample 進(jìn)行請(qǐng)求猛蔽,debugSample 在查看結(jié)果樹中 進(jìn)行調(diào)試 。
2.也可以打印日志 log.info() 進(jìn)行調(diào)試灵寺,需要先打開查看日志的選項(xiàng):
二. 編碼問題:
jmeter亂碼 修改jmeter\bin\jmeter.properties文件:
-
把“jsyntaxtextarea.font.family=Hack”這行的“#”注釋去掉 或者添加一行 用中文字體都行
-
sampleresult.default.encoding="utf-8"
-
參數(shù)化的話 文件另存為utf-8 的話 曼库,編碼需要 utf-8,系統(tǒng)默認(rèn)的話就不用
-
http請(qǐng)求的 content encoding:utf-8
-
生成加密的java源碼的方法中指定請(qǐng)求編碼類型: s.getBytes("utf-8")