下面是一个完整的解决方案,通过自定义 mitmproxy Python 脚本捕获 HTTP 流量,过滤特定请求,并直接生成 JMeter 可用的 JMX 文件,无需经过 HAR 转换中间步骤。
完整脚本代码
将以下脚本保存为 mitmproxy_jmx_exporter.py
:
from mitmproxy import http, ctx
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom import minidom
import urllib.parse
import datetimeclass JMXGenerator:def __init__(self):# 初始化JMX文档结构self.jmx = Element('jmeterTestPlan', version="1.2", properties="5.0", jmeter="5.4.1")hash_tree = SubElement(self.jmx, 'hashTree')# 创建测试计划test_plan = SubElement(hash_tree, 'TestPlan', {'guiclass': 'TestPlanGui','testclass': 'TestPlan','testname': 'Mitmproxy Generated Test','enabled': 'true'})SubElement(test_plan, 'boolProp', {'name': 'TestPlan.user_define_classpath'}).text = 'false'# 创建线程组thread_group_hash = SubElement(hash_tree, 'hashTree')self.thread_group = SubElement(thread_group_hash, 'ThreadGroup', {'guiclass': 'ThreadGroupGui','testclass': 'ThreadGroup','testname': 'Thread Group','enabled': 'true'})# 线程组配置SubElement(self.thread_group, 'intProp', {'name': 'ThreadGroup.num_threads'}).text = '1'SubElement(self.thread_group, 'intProp', {'name': 'ThreadGroup.ramp_time'}).text = '1'SubElement(self.thread_group, 'boolProp', {'name': 'ThreadGroup.scheduler'}).text = 'false'# 存储采样器的hashTreeself.samplers_hash = SubElement(thread_group_hash, 'hashTree')# 请求计数器self.request_count = 0self.filtered_count = 0def add_request(self, flow: http.HTTPFlow):"""添加HTTP请求到JMX"""url = flow.request.url# 过滤条件 - 修改这里实现你的过滤逻辑if self._should_filter(flow):self.filtered_count += 1returnself.request_count += 1# 创建HTTP采样器sampler = SubElement(self.samplers_hash, 'HTTPSamplerProxy', {'guiclass': 'HttpTestSampleGui','testclass': 'HTTPSamplerProxy','testname': f"{flow.request.method} {flow.request.host}",'enabled': 'true'})# 配置HTTP请求SubElement(sampler, 'stringProp', {'name': 'HTTPSampler.domain'}).text = flow.request.hostSubElement