• 0
  • 1
分享
  • JMeter日志查看与日志分析——软件测试圈
  • 橙子 2024-06-27 14:16:46 字数 3356 阅读 1196 收藏 1

  1 JMeter日志概览

  jmeter日志文件保存在bin目录中,名称为jmeter.log。我们可以在面板中直接察看日志,点击右上角黄色标志物可以打开日志面板,再次点击收起。

1-1.png

  另外,JMeter可以很方便地设置日志输出级别:

1-2.png

  通过这种方式修改日志级别,只是零时修改,不会改变配置文件中的值。当Jmeter重启后,又会恢复为默认的日志级别。

  在Jmeter/bin 路径下打开 log4j2.xml文件,修改日志级别,这里修改该是永久性修改

  通过修改Root level 值改变日志级别,该修改是永久性的。对Jmeter 的GUI页面运行脚本和命令模式运行脚本都会生效。

1-3.png

  2 JMeter自定义日志

  前面所看到的都是系统日志,也就是JMeter本身所打印的日志。如果我们自己想输出一些日志,该怎么办呢?这个一般就要借助Beanshell了。

1-4.png

  在实际项目中,将JMeter脚本部署到Linux服务器上进行压力测试,存在一些日志详情查看的不便之处:

  吞吐量统计中包括了所有请求,包括一些辅助请求(beanshell请求),导致真正的tps统计数据不准确。

  业务是否成功,以及具体失败原因难以排查。

  这就需要用到beanshell下的自定义日志。log.info,log.error,如用log.error()打印错误信息

  import org.apache.log4j.Logger;
   
  // 获取接口的响应数据
  String result = prev.getResponseDataAsString();
   
  if(result.contains("error")){
      Failure=true;
      log.error("接口失败: " + result);
  }

  当然,自定义日志最重要应用场景还是在Linux服务器上压测时,方便查看日志信息(因linux上无图形化界面)

  比如,获取orderid时脚本:

  import org.apache.log4j.Logger;
   
  // 获取接口的响应数据
  String result = prev.getResponseDataAsString();
  // 从JSON提取器中获取code和orderId
  String code = vars.get("code");
  String orderId = vars.get("orderId");
   
  if(code.equals("0")){
  log.info("place order success, orderId=" + orderId);
  }else{
  Failure=true;
  log.error("FailureMessage: " + result);
  }

  将该脚本上传到Linux中,顺便写个启动脚本:startup.sh

  #!/bin/bash
  jmeter_log=/home/xxx/jmeter.log
   
  if [ -f "$jmeter_log" ]; then
   // 将原日志文件备份后删除
   cp $jmeter_log /home/xxx/jmeter.log_back
   rm -rf $jmeter_log
  fi
  // 启动JMeter脚本
  jmeter -n -t /home/xxx/test.jmx -l /home/xxx/result/test.jtl -j ../result/log/jmeter_error.log

  命令解释:使用该命令调用jmeter进行性能测试,-n:命令模式运行,-t : 后面跟的是需要执行的脚本名称,-l :后跟的是聚合报告保存路径,-j :跟的是日志保存路径,

  运行脚本后,cat jmeter_error.log即可查看日志详情。

  3 JMeter日志分析

  针对该日志写一个日志分析脚本logAnalysis.sh:

  #!/bin/bash
  jmeter_log=/home/test/jmeter.log
  thread_num=`grep 'Thread started' $jmeter_log|tail -n 1|awk -F"-" '{print$6}'`
  start_time=`grep 'All thread groups have been started' $jmeter_log|awk -F" " '{print $1,$2}'|awk -F"," '{print $1}'`
  end_time=`grep 'Shutdown hook ended' $jmeter_log|awk -F" " '{print $1,$2}'|awk -F"," '{print $1}'`
   
  final_success_time=`grep "place order success" $jmeter_log|tail -n 1|awk -F" " '{print$1,$2}'|awk -F"," '{print$1}'`
  success_running_time=$[ $(date -d "$final_success_time" +%s) - $(date -d "$start_time" +%s) ]
  running_time=$[ $(date -d "$end_time" +%s) - $(date -d "$start_time" +%s) ]
  cancle_times=`grep "cancle orders success" $jmeter_log|wc -l`   //撤单次数
   
  success_times=`grep success $jmeter_log|wc -l`   // 成功次数
  failure_times=`grep FailureMessage $jmeter_log|wc -l`
  request_times=$[ $success_times+$failure_times ]
  error_rate=`echo "scale=2; $failure_times/$request_times*100" | bc`
  qps=$[ $request_times/$running_time ]
  throughput=$[ $success_times/$success_running_time ]
   
  echo -e '线程数:'$thread_num
  echo -e '请求次数:' $request_times
  echo -e '成功次数:' $success_times
  echo -e '失败次数:' $failure_times
  echo -e '撤单次数:'$cancle_times
  echo -e '错误率:' $error_rate'%'
  echo -e '开始时间:'$start_time
  echo -e '结束时间:'$end_time
  echo -e '最后成功请求时间:'$final_success_time
  echo -e '请求时间:' $running_time 
  echo -e '成功运行时间:'$success_running_time
  echo -e '吞吐量:'$throughput'/s'
  echo -e 'QPS:'$qps'/s'

  当JMeter脚本运行一段时间后,执行logAnalysis.sh,效果如下:

  线程数:200
  请求次数: 120000
  成功次数:120000
  失败次数: 0
  错误率: 0%
  ...
  吞吐量:9000/s
  QPS:9000/s

  可以看到,输出信息全面清晰。这样,我们就可以在linux下运行JMeter压测脚本时,实时获取压测详情了。


作者:bulabula2022    

来源:http://www.51testing.com/html/93/n-7796493.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   引言  看到这个标题的时候,相信大部分人的第一反应一定是:卧槽!标题党来了!  是的,你猜对了,-_-。  其实之所以写这篇文章,是因为有一个读者,遇到了人生中一次比较重要的抉择,因而来咨询LZ,而LZ恰好无事,因此就十分耐心的给这个读者谈了谈自己的一些想法,而这个读者事后也表示茅塞顿开。后来LZ觉得这次谈话内容,或许对不少人也有帮助和警醒的作用,因此就决定索性用文字的形式记录下来,这就是这篇文章出处了。当然了,是否对所有人都有用,LZ也不做任何担保,现在毕竟是信息爆炸时代,所有人都需要具备两项最基本的技能:信息筛选和自我判断能力。不然的话,你早晚会被淹没在网络的信息海洋里。  好了,接下...
            0 0 979
            分享
          • 一、前言相信不少,应该说绝大数的测试同学都遇到过这样的场景,上线出现了BUG,被质问:为什么没测出来!测试怎么测得?到底会不会测?这对测试来说是灵魂拷问级别不好回答的问题了。那么我们遇到类似这样的提问该如何回答、解决呢?二、如何回答和解决其实当遇到线上出现问题的时候,不管这个问题是谁的锅, 先以解决问题为主, 先复现问题, 再配合开发调试定位问题进行修复, 然后测试完成进行紧急的修复上线才是最应该做的事情!这个时候也不要进行任何甩锅的操作,也不要默不作声的不说话。可以回答说:我们会在这个问题修复上线后进行复盘,找出问题出现的原因,如果是测试团队的问题,我们会主动承担责任并作出总结,避免下次再犯...
            13 12 2433
            分享
          •   Twitter的蓝标认证制度近日引发了一系列争议。自从特斯拉CEO埃隆?马斯克收购了这家社交网络公司后,他就对Twitter的认证政策进行了多次调整,引起了用户和媒体的不满。  最初,马斯克取消了几乎所有在他收购之前就已经获得蓝标认证的账号,包括一些政治人物、名人和媒体机构。他表示,用户需要付费8美元每月才能获得蓝标认证,以此来提高Twitter的收入。然而,不久后有消息曝出,马斯克私下给三位明星Twitter用户加上了蓝标,分别是演员汤姆·克鲁斯、歌手碧昂斯和作家J·K·罗琳。这一举动引发了其他用户的不平之鸣。  随后,Twitter又宣布恢复了许多拥有超过100万粉丝的账号的蓝标认证,...
            0 0 784
            分享
          • 一、什么情况下开展接口测试?1、项目处于开发阶段,前后端联调接口是否请求的通;2、有接口需求文档,开发已完成联调(可以转测),功能测试展开之前;3、版本上线前,进行整体回归测试,查看接口是否有异常(如404等)。对准备上线的版本进行抓包,查看服务器地址是都正确;4、版本功能稳定后,接口自动化;5、还可以应用在安全测试,性能测试领域等。二、如何进行接口测试发送http请求来进行测试,首先我们要看请求的方法是什么get、post或者其他请求、之后输入URL地址,比如get请求请求百度。post请求请求登录,post请求一般需要传递参数,所以我们要在body添加登录名和密码返回结果:参数名称,类型,...
            2 1 1658
            分享
          • 入行测开,马上就要4年了。创业公司待过,大公司也待过,工作这一路走来,一些心得,转变,职场体会,早就想写出来分享一下。这个历程包含了技术的提升,工程师的素养和对这个行业的点滴感悟。自动化测试vs测试开发记得刚入行那会,我的title是自动化测试工程师。那时对这两者的区别还没那么明显,面试时候两者的问题也都比较类似。当时招聘“会写代码的测试人员”比较偏向称之为“自动化测试工程师”;不过现在很多企业的招聘都变为“测试开发工程师”了。究其概念,其实自动化测试工程师更偏向于业务方向的效率提升;而测试开发则更偏向于基础架构方向的效率提升。打个简单的比方,测试开发工程师产出的框架可以认为是父类,自动化测试...
            0 4 1919
            分享
      • 51testing软件测试圈微信