关闭

Jmeter实现自动化压测(思路&样例)

发表于:2024-5-21 09:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:拂羽    来源:知乎

  一、思路
  测试计划(Test Plan)的创建:在JMeter中,首先要创建一个测试计划,这个计划包含了所有的测试元素和它们的执行顺序。
  配置测试元素:这包括添加和配置线程组(模拟用户),采样器(例如HTTP请求),逻辑控制器,定时器,监听器(用于查看结果)等。
  参数化和变量:为了重复利用脚本和模拟不同的用户行为,可以使用参数化和变量。例如,可以使用CSV数据文件配置器来读取测试数据。
  脚本增强:可以使用JSR223或BeanShell脚本来自定义测试逻辑,增强脚本的灵活性和功能。
  执行测试:配置好脚本后,可以本地运行JMeter进行测试,也可以通过命令行的方式在服务器上执行。
  监控和分析结果:测试执行时,JMeter会收集数据并在监听器中显示结果。测试结束后,可以分析这些数据来评估系统的性能。
  自动化执行:为了实现自动化,可以将JMeter脚本与持续集成工具(如Jenkins)结合使用,定时执行或者触发执行。
  二、样例
  2.1 方法一(手动管理)
  1. 编写JMeter脚本:首先,您需要创建一个JMeter脚本,包括线程组、采样器、监听器等元素,并配置好所有的测试参数。
  2. 命令行执行:JMeter可以通过命令行的方式执行。可以保存脚本为`.jmx`文件,然后在命令行中运行以下命令来执行测试:
  # `-n`表示非GUI模式,`-t`指定测试计划的路径,`-l`指定JMeter保存测试结果的CSV文件的路径。
  jmeter -n -t [path_to_jmx_file] -l [path_to_output_file]
  3. 定时任务 :如果希望定期执行测试,可以使用操作系统的定时任务功能。例如,在Windows中,可以使用“任务计划程序”来设置定时执行JMeter脚本。在Linux中,可以使用`cron`来实现定时任务。
  4. 结果分析:测试执行后,需要手动分析结果。JMeter会生成一个CSV格式的结果文件,可以使用Excel、文本编辑器或专业的数据分析工具来查看和分析这些数据。
  5. 报告生成:JMeter还提供了生成HTML报告的功能。可以使用以下命令来生成报告:
  #`-g`指定了JMeter结果文件的路径,`-o`指定了生成HTML报告的文件夹路径。
  jmeter -g [path_to_output_file] -o [path_to_report_folder]
  6. 邮件通知:如果需要邮件通知测试结果,可能需要编写一个简单的脚本来读取JMeter的结果文件,并将结果通过邮件发送。这可以通过使用SMTP服务器和邮件客户端的API来实现。
  7. 自动化测试流程:可以编写一个自动化脚本,该脚本按顺序执行上述步骤,包括启动JMeter测试、分析结果、生成报告和发送邮件通知。
  通过这种方式,即使没有CI工具,也可以实现JMeter的自动化压测。不过,这种方法需要手动管理测试的触发、结果分析和报告分发,因此在大型或频繁的测试场景中,使用CI工具会更加高效和方便。
  2.2 方法二(编写脚本实现自动化管理)
  python实现
  ·安装Python:确保系统上安装了Python
  · 安装JMeter:确保JMeter已安装在系统上,并且可以在命令行中运行。
  · 编写Python脚本
  #1、导入所需的模块,例如subprocess来执行命令行命令,time来处理时间相关的操作。
  #2、定义JMeter脚本的路径、输出结果的路径和HTML报告的路径
  #3、编写函数来执行JMeter测试
  def run_jmeter_test(jmx_file, output_file):
      jmeter_command = f"jmeter -n -t {jmx_file} -l {output_file}"
      subprocess.run(jmeter_command, shell=True)
  #4、编写函数来生成HTML报告
  def generate_html_report(output_file, report_folder):
      report_command = f"jmeter -g {output_file} -o {report_folder}"
      subprocess.run(report_command, shell=True)
  #5、编写一个主函数来调用上述函数,并设置定时任务或触发条件
  def main():
      jmx_file = "path/to/your/script.jmx"
      output_file = "path/to/output/results.jtl"
      report_folder = "path/to/output/report"
      
      # 定时执行或根据条件触发
      while True:
          current_time = time.localtime()
          if current_time.tm_hour == 0 and current_time.tm_min == 0:  # 每天午夜执行
              run_jmeter_test(jmx_file, output_file)
              generate_html_report(output_file, report_folder)
          time.sleep(60)  # 每分钟检查一次时间
  #6、在脚本的最后调用主函数
  if __name__ == "__main__":
      main()
  ·运行脚本:保存脚本并运行它。脚本将根据设置的条件自动执行JMeter测试,并生成HTML报告。
  · 邮件通知(可选):如果需要邮件通知功能,可以使用Python的smtplib和email模块来编写发送邮件的函数,并在适当的时候调用它。
  · 日志记录(可选):若想在脚本中添加日志记录功能,以便记录测试的执行情况和任何出现的错误。Python的logging模块可以实现。
  bash脚本
  #首先,创建一个名为run_jmeter_test.sh的新文件,并在其中写入以下Bash脚本
  #!/bin/bash
  # JMeter脚本和输出文件路径
  jmx_file="path/to/your/script.jmx"
  jtl_file="path/to/output/results.jtl"
  html_report_dir="path/to/output/report"
  # 当前时间
  now=$(date +%Y-%m-%d_%H-%M-%S)
  # 执行JMeter测试
  echo "开始执行测试: $now"
  jmeter -n -t "$jmx_file" -l "$jtl_file"
  # 生成HTML报告
  echo "生成HTML报告"
  jmeter -g "$jtl_file" -o "$html_report_dir"
  # 邮件发送相关配置
  smtp_server="smtp.example.com"
  sender_email="sender@example.com"
  receiver_email="receiver@example.com"
  subject="JMeter 测试报告 $now"
  body="请查看附件中的JMeter测试报告。"
  # 创建邮件内容
  message=$(cat <<EOF
  Subject: $subject
  From: $sender_email
  To: $receiver_email
  $body
  EOF
  )
  # 添加HTML报告作为附件
  message=$(cat <<EOF$message
  Content-Type: text/html; name="index.html"
  Content-Transfer-Encoding: base64
  Content-Disposition: attachment; filename="index.html"
  $(base64 "$html_report_dir/index.html")
  EOF
  )
  # 发送邮件
  echo "发送邮件"
  echo "$message" | sendmail -t
  echo "测试完成"
  在运行此脚本之前,需替换脚本中的路径、邮件服务器配置、发件人、收件人等信息为实际的值。
  这个脚本做了以下几件事情:
  1. 使用jmeter命令行进行测试。
  2. 使用jmeter命令生成HTML报告。
  3. 设置邮件内容,包括主题、发件人、收件人和正文。
  4. 将HTML报告作为附件,使用base64编码附加到邮件中。
  5. 使用sendmail命令发送邮件。
  要运行这个脚本,还需要给它执行权限,然后可以在命令行中执行它:
  chmod +x run_jmeter_test.sh
  ./run_jmeter_test.sh
  三、自动化脚本对服务进行分组压测
  3.1 思路
  设计测试计划:根据需要压测的服务,设计测试计划,确定分组方式和测试目标。
  创建JMeter脚本:为每个服务分组创建单独的JMeter脚本(.jmx文件),或者在一个脚本中创建多个线程组,每个线程组代表一个服务分组。
  编写自动化脚本:使用Python或Bash编写自动化脚本,用于触发JMeter测试、收集结果和生成报告。
  执行测试:运行自动化脚本,对每个服务分组进行压测。
  分析结果:测试完成后,分析每个服务分组的性能数据。
  3.2 脚本样例
  注:
  1、在运行这些脚本之前,请确保已经替换了脚本中的路径为实际的JMeter脚本路径、输出文件路径和报告目录。
  2、要运行Python脚本,执行python script.py(其中script.py是Python脚本文件名)。
  要运行Bash脚本,执行bash script.sh(其中script.sh是Bash脚本文件名)。
  3、这些脚本将依次执行每个服务分组的JMeter测试,生成HTML报告,并最终输出一个简单的完成消息。
  Python脚本示例:
  import subprocess
  import time
  # JMeter脚本的路径和输出文件路径
  jmx_files = {
      'group1': 'path/to/script1.jmx',
      'group2': 'path/to/script2.jmx'
  }
  output_files = {
      'group1': 'path/to/output1.jtl',
      'group2': 'path/to/output2.jtl'
  }
  html_report_dirs = {
      'group1': 'path/to/report1',
      'group2': 'path/to/report2'
  }
  # 执行JMeter测试
  for group, jmx_file in jmx_files.items():
      output_file = output_files[group]
      html_report_dir = html_report_dirs[group]
      print(f"开始执行{group}的测试")
      subprocess.run(['jmeter', '-n', '-t', jmx_file, '-l', output_file])
      print("生成HTML报告")
      subprocess.run(['jmeter', '-g', output_file, '-o', html_report_dir])
      print(f"{group}测试完成")
  # 等待所有测试完成
  time.sleep(5)
  # 分析结果(这里只是简单打印完成,实际应用中可能需要更复杂的分析逻辑)
  print("所有分组测试完成")
  Bash脚本示例
  #!/bin/bash
  # JMeter脚本的路径和输出文件路径
  declare -A jmx_files
  jmx_files[group1]="path/to/script1.jmx"
  jmx_files[group2]="path/to/script2.jmx"
  declare -A output_files
  output_files[group1]="path/to/output1.jtl"
  output_files[group2]="path/to/output2.jtl"
  declare -A html_report_dirs
  html_report_dirs[group1]="path/to/report1"
  html_report_dirs[group2]="path/to/report2"
  # 执行JMeter测试
  for group in "${!jmx_files[@]}"; do
      jmx_file="${jmx_files[$group]}"
      output_file="${output_files[$group]}"
      html_report_dir="${html_report_dirs[$group]}"
      echo "开始执行${group}的测试"
      jmeter -n -t "$jmx_file" -l "$output_file"
      echo "生成HTML报告"
      jmeter -g "$output_file" -o "$html_report_dir"
      echo "${group}测试完成"
  done
  # 等待所有测试完成
  sleep 5
  # 分析结果(这里只是简单打印完成,实际应用中可能需要更复杂的分析逻辑)
  echo "所有分组测试完成"
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2024软件测试行业从业人员调查问卷》,您的见解,行业的声音!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号