[关闭]
@huis 2016-10-24T11:38:24.000000Z 字数 2863 阅读 152

Jmeter学习笔记1

Jmeter


如何进行Base64 Encode

使用场景是后台基于Basic认证,有一些请求是被放行的但是又需要Basic认证,这时需要对用户名和密码进行Base64加密已header的形式进行传输,但是要如何进行呢?
使用BeanShell PreProcessor进行脚本编写,具体使用方法如下:

  1. import org.apache.commons.codec.binary.Base64;
  2. String basic = "Basic ";
  3. String username=vars.get("username");
  4. String password=vars.get("password");
  5. String str = username + ":" + password;
  6. byte[] encryptedUid = Base64.encodeBase64(str.getBytes());
  7. vars.put("userkey",basic+new String(encryptedUid));

编写脚本可以再Java编辑器中调试和执行,成功后移到Jmeter中

如何处理JSON对象

这里用到的是org.json包,下载地址是https://mvnrepository.com/artifact/org.json/json,下载后的jar包需要放到Jmeter的lib文件夹下面,Mac系统下的lib地址是:/usr/local/Cellar/jmeter/3.0/libexec/lib,Windows下自己找。下面的是使用BeanShellPostProcessor进行脚本编写的自动考试答题的例子,代码如下:

  1. import org.json.*;
  2. import java.util.*;
  3. String response_data = prev.getResponseDataAsString();
  4. JSONObject data_obj = new JSONObject(response_data);
  5. String parts_str = data_obj.get("paperPartList").toString();
  6. JSONArray parts_array = new JSONArray(parts_str);
  7. List results = new ArrayList();
  8. String examRecId = vars.get("examRecId");
  9. for (int i = 0, n = parts_array.length(); i < n; i++) {
  10. JSONObject part_obj = new JSONObject(parts_array.get(i).toString());
  11. String partId = part_obj.get("partId").toString();
  12. JSONArray quesList = new JSONArray(part_obj.get("partQusList").toString());
  13. for (int j = 0, jn = quesList.length(); j < jn; j++) {
  14. JSONObject ques_obj = new JSONObject(quesList.get(j).toString());
  15. String qusId = ques_obj.get("questionId").toString();
  16. String ansstr = new JSONObject(ques_obj.get("questionDetail").toString()).get("answers").toString();
  17. JSONArray answersArray = new JSONArray(ansstr);
  18. Random random = new Random();
  19. int randomIndex = random.nextInt(answersArray.length());
  20. JSONObject ans_obj = new JSONObject(answersArray.get(randomIndex).toString());
  21. JSONObject newJson = new JSONObject();
  22. newJson.put("examRecId", examRecId);
  23. newJson.put("partId", Integer.parseInt(partId));
  24. newJson.put("qusId", Integer.parseInt(qusId));
  25. newJson.put("answer", ans_obj.get("answerId").toString());
  26. results.add(newJson.toString());
  27. }
  28. }
  29. vars.put("answers",results.toString());

如何正确运行Jmeter脚本

假设现在要线上要实现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
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注