@huis
2016-10-24T11:38:24.000000Z
字数 2863
阅读 152
Jmeter
使用场景是后台基于Basic认证,有一些请求是被放行的但是又需要Basic认证,这时需要对用户名和密码进行Base64加密已header的形式进行传输,但是要如何进行呢?
使用BeanShell PreProcessor进行脚本编写,具体使用方法如下:
import org.apache.commons.codec.binary.Base64;
String basic = "Basic ";
String username=vars.get("username");
String password=vars.get("password");
String str = username + ":" + password;
byte[] encryptedUid = Base64.encodeBase64(str.getBytes());
vars.put("userkey",basic+new String(encryptedUid));
编写脚本可以再Java编辑器中调试和执行,成功后移到Jmeter中
这里用到的是org.json
包,下载地址是https://mvnrepository.com/artifact/org.json/json,下载后的jar包需要放到Jmeter
的lib文件夹下面,Mac系统下的lib地址是:/usr/local/Cellar/jmeter/3.0/libexec/lib
,Windows下自己找。下面的是使用BeanShellPostProcessor进行脚本编写的自动考试答题的例子,代码如下:
import org.json.*;
import java.util.*;
String response_data = prev.getResponseDataAsString();
JSONObject data_obj = new JSONObject(response_data);
String parts_str = data_obj.get("paperPartList").toString();
JSONArray parts_array = new JSONArray(parts_str);
List results = new ArrayList();
String examRecId = vars.get("examRecId");
for (int i = 0, n = parts_array.length(); i < n; i++) {
JSONObject part_obj = new JSONObject(parts_array.get(i).toString());
String partId = part_obj.get("partId").toString();
JSONArray quesList = new JSONArray(part_obj.get("partQusList").toString());
for (int j = 0, jn = quesList.length(); j < jn; j++) {
JSONObject ques_obj = new JSONObject(quesList.get(j).toString());
String qusId = ques_obj.get("questionId").toString();
String ansstr = new JSONObject(ques_obj.get("questionDetail").toString()).get("answers").toString();
JSONArray answersArray = new JSONArray(ansstr);
Random random = new Random();
int randomIndex = random.nextInt(answersArray.length());
JSONObject ans_obj = new JSONObject(answersArray.get(randomIndex).toString());
JSONObject newJson = new JSONObject();
newJson.put("examRecId", examRecId);
newJson.put("partId", Integer.parseInt(partId));
newJson.put("qusId", Integer.parseInt(qusId));
newJson.put("answer", ans_obj.get("answerId").toString());
results.add(newJson.toString());
}
}
vars.put("answers",results.toString());
假设现在要线上要实现200人的并发,但是不知道现有的服务器是否满足或缺多少?对此我们要做性能测试,但是测试只能在测试环境进行,测试服务器和线上服务器数量和性能是不一样的,那要怎么测?
错误想法是:
1. 我要进行200人的测试,好,那我就在测试环境进行200人测试
2. 要200人并发,那我把线程组的线程准备时间设置为0
正确做法是:
- 线上服务器是几台,配置是啥?测试服务器是几台,配置是啥?算出比例值:m(整数)
- 200人并发,是完全200人同时操作,还是只是一定比例的人员会同时操作?算出比例值:n(百分数)
- 根据前两条得出计算公式:
假设线上服务器数量4台4核,测试服务器数量1台1核,那么m=16,又比如需要完全200人,那么n=100%,由此得出,测试并发数为13人
- 也就是说我们测试时,只需要测试13人并发即可
- 那对于怎么建立真正的并发,不是靠设置启动全部线程数时长为0,这样会导致测试机和服务器都突然并发,影响测试准确性。应当不快不慢的启动,持续运行几十分钟大量采样才能更好的测出结果。比如:13线程,设置60s启动,也就是5秒左右一个线程,具体应该多次测试找出合适值
当然实际测试当中,一台4核的服务器并不能等于4台1核的服务器,这个值可能会缩小,所以要多次测试,计算出大约比例。
也可以根据测试服务器最佳并发数反推出线上支持的最佳并发数。
分析结果:
- 假设测试服务器1核最佳并发数为
12人
,考虑1台4核~=3*1台1核
,所以1台4核服务器最佳并发数为36人
,计算出m=3x4(台)=12
,n还为100%
,最终计算出,我们现有的4台4核
服务器能支持大约12x12=144
人并发,不能支持200人
,所以要扩容到6台4核
才可以,计算方式台数:200/36(1台4核最佳人数)~=5.55~=6