使用 mitmproxy 自定义脚本过滤请求并直接生成 JMX
下面是一个完整的解决方案,通过自定义 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 datetime
class 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'
# 存储采样器的hashTree
self.samplers_hash = SubElement(thread_group_hash, 'hashTree')
# 请求计数器
self.request_count = 0
self.filtered_count = 0
def add_request(self, flow: http.HTTPFlow):
"""添加HTTP请求到JMX"""
url = flow.request.url
# 过滤条件 - 修改这里实现你的过滤逻辑
if self._should_filter(flow):
self.filtered_count += 1
return
self.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