影刀RPA 负载测试自动化JMeter脚本自动执行与报告作者林焱 | 分类影刀RPA新手教程 | 难度★★★什么情况用性能测试工程师需要定期执行负载测试如双11前的压测、新版本上线前的基准测试。JMeter脚本写好之后每次执行都是重复劳动打开JMeter → 加载脚本 → 设置参数 → 运行 → 等结果 → 导出报告。如果有10个场景要测一天时间全挂在JMeter上。用影刀RPA自动调度JMeter脚本执行收集结果生成对比报告。测试工程师写好脚本就可以不管了RPA负责跑完并给结果。怎么做第一步准备JMeter测试脚本把常用的测试场景保存为.jmx文件拼多多店群自动化上架方案测试场景脚本文件并发数持续时间执行时机登录接口基准测试login_baseline.jmx1005分钟每周一商品列表压力测试product_list_load.jmx50010分钟每月下单流程混合测试order_mixed.jmx20015分钟上线前第二步影刀调用JMeter命令行JMeter支持无GUI命令行执行这正是RPA需要的# 影刀Python节点调用JMeter命令行importsubprocessimportosfromdatetimeimportdatetime JMETER_HOMEC:/apache-jmeter-5.6.3# JMeter安装目录JMETER_BINos.path.join(JMETER_HOME,bin,jmeter.bat)# Windowsdefrun_jmeter_test(script_path,output_dir,threads100,duration300): 执行JMeter测试 threads: 并发线程数 duration: 持续时间秒 timestampdatetime.now().strftime(%Y%m%d_%H%M%S)result_fileos.path.join(output_dir,fresult_{timestamp}.jtl)report_diros.path.join(output_dir,freport_{timestamp})cmd[JMETER_BIN,-n,# 非GUI模式-t,script_path,# 测试脚本-l,result_file,# 结果文件-e,# 生成HTML报告-o,report_dir,# 报告输出目录f-Jthreads{threads},# 传入并发参数f-Jduration{duration},# 传入持续时间参数]try:resultsubprocess.run(cmd,capture_outputTrue,textTrue,timeoutduration120,# 比测试多2分钟cwdJMETER_HOME,)# 检查是否成功ifend of runinresult.stdout.lower()oros.path.exists(result_file):return{success:True,result_file:result_file,report_dir:report_dir,output:result.stdout[-500:],# 最后500字符}else:return{success:False,error:result.stderr[-500:],}exceptsubprocess.TimeoutExpired:return{success:False,error:测试执行超时}# 执行测试resultrun_jmeter_test(D:/jmeter_scripts/login_baseline.jmx,D:/jmeter_results/,threads100,duration300)ifresult[success]:print(f✅ 测试完成报告{result[report_dir]})else:print(f❌ 测试失败{result[error]})第三步解析JMeter结果提取关键指标# 影刀Python节点从JTL结果文件中提取摘要importxml.etree.ElementTreeasETimportcsvdefparse_jtl_summary(jtl_file):从JMeter结果文件中提取关键指标stats{label:[],samples:[],avg_ms:[],min_ms:[],max_ms:[],error_pct:[],throughput:[],# 每秒请求数}# JTL是CSV格式取决于配置withopen(jtl_file,r,encodingutf-8)asf:readercsv.DictReader(f)forrowinreader:ifrow.get(label)androw.get(success)isnotNone:stats[label].append(row[label])stats[samples].append(int(row.get(elapsed,0)))# 计算汇总![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1d91c4707b8b4a8aa7ea48c49b0441cf.png#pic_center)ifstats[samples]:summary{总请求数:len(stats[samples]),平均响应时间(ms):int(sum(stats[samples])/len(stats[samples])),最大响应时间(ms):max(stats[samples]),最小响应时间(ms):min(stats[samples]),}# 计算P95/P99sorted_samplessorted(stats[samples])p95_idxint(len(sorted_samples)*0.95)p99_idxint(len(sorted_samples)*0.99)summary[P95响应时间(ms)]sorted_samples[p95_idx]ifp95_idxlen(sorted_samples)elsesorted_samples[-1]summary[P99响应时间(ms)]sorted_samples[p99_idx]ifp99_idxlen(sorted_samples)elsesorted_samples[-1]returnsummaryreturnNonesummaryparse_jtl_summary(D:/jmeter_results/result_20260628_100000.jtl)forkey,valueinsummary.items():print(f{key}:{value})第四步历史对比分析# 影刀Python节点对比本次和上次结果defcompare_with_baseline(current,baseline):对比结果并标记恶化指标ifnotbaseline:return无历史基准数据comparisons[]formetricin[平均响应时间(ms),P95响应时间(ms),P99响应时间(ms)]:curr_valcurrent.get(metric,0)base_valbaseline.get(metric,0)ifbase_val0:change(curr_val-base_val)/base_val*100flagifchange20else(ifchange10else)comparisons.append(f{flag}{metric}:{base_val}ms →{curr_val}ms{change:.1f}%)return\n.join(comparisons)print(compare_with_baseline(current_summary,last_week_summary))第五步测试调度与通知在影刀中设置定时任务每周一早上6:00 → 执行基准测试套件上线前一日晚上 → 执行全量压力测试测试完成后【企微推送】→ 发送摘要通过/失败、关键指标、对比变化【邮件】→ 附带HTML测试报告链接【写入Excel】→ 追加到性能测试历史记录表有什么坑坑1JMeter需要Java环境TEMU店群如何管理运营JMeter依赖Java运行时。如果影刀运行的机器上没有Java或版本不匹配命令行会失败。建议在流程开头先检查java -version。坑2长时间测试可能撑爆磁盘JMeter默认会记录每个请求的详细信息。100并发跑10分钟可能产生几百MB的JTL文件。记得在JMeter脚本里配置只记录错误日志或者在测试脚本中关闭详细记录。坑3GUI和命令行结果有差异JMeter GUI模式显示的结果和命令行生成的HTML报告数值上可能有微小差异因为采样精度不同。以命令行HTML报告为准。坑4测试环境网络波动影响从办公电脑压测可能会受本地网络影响。如果P95突然飙升不一定是服务端性能下降可能是你本地WiFi卡了。建议从和服务器同一机房的机器执行。坑5并发参数传递方式JMeter脚本中的${__P(threads, 10)}写法是引用命令行传入的参数-Jthreads100。如果脚本里写死了线程数命令行参数不会生效。修改脚本时要注意用参数化方式写。总结JMeter自动化的价值是把性能测试从专门抽时间做变成定期自动跑。双11前可以每天跑一次压测趋势一目了然上线前不会有性能会不会挂的焦虑。