一、思路
测试计划(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),我们将立即处理