通过 mitmproxy 生成 JMeter JMX 文件

mitmproxy 是一个强大的中间人代理工具,可以捕获 HTTP/HTTPS 流量。结合 mitmproxy 和 JMeter,你可以轻松地将捕获的流量转换为 JMX 测试计划。以下是详细步骤:

方法一:mitmproxy → HAR → JMX

1. 使用 mitmproxy 捕获流量并生成 HAR 文件

bash
复制
# 启动 mitmproxy 并记录到 HAR 文件
mitmproxy -w output.har

或者使用 mitmdump(非交互式版本):

bash
复制
mitmdump -w output.har

2. 将 HAR 转换为 JMX

使用 JMeter 内置转换器:

  • 打开 JMeter

  • 选择 File > Import > Open HAR File

  • 选择生成的 output.har 文件

或者使用 BlazeMeter 在线转换器:
https://converter.blazemeter.com/

方法二:使用 mitmproxy2jmeter 脚本

这是一个专门将 mitmproxy 流量转换为 JMX 的工具:

  1. 安装 mitmproxy2jmeter:

bash
复制
pip install mitmproxy2jmeter
  1. 运行转换:

bash
复制
mitmproxy2jmeter -i input.mitm -o output.jmx

方法三:自定义 mitmproxy 脚本直接生成 JMX

创建 Python 脚本(如 mitm_to_jmx.py):

python
复制
from mitmproxy import http
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom import minidom
import datetime

class JMeterExporter:
    def __init__(self):
        self.testplan = Element('TestPlan', guiclass="TestPlanGui", testclass="TestPlan", testname="Test Plan", enabled="true")
        hash_tree = SubElement(self.testplan, 'hashTree')
        
        thread_group = SubElement(hash_tree, 'ThreadGroup', {
            'guiclass': 'ThreadGroupGui',
            'testclass': 'ThreadGroup',
            'testname': 'Thread Group',
            'enabled': 'true'
        })
        # 添加线程组配置...
        self.hash_tree = SubElement(hash_tree, 'hashTree')
        
    def add_request(self, flow: http.HTTPFlow):
        http_sampler = SubElement(self.hash_tree, 'HTTPSamplerProxy', {
            'guiclass': 'HttpTestSampleGui',
            'testclass': 'HTTPSamplerProxy',
            'testname': flow.request.url,
            'enabled': 'true'
        })
        # 配置请求方法、路径、参数等...
        
    def save(self, filename):
        xml_str = tostring(self.testplan, 'utf-8')
        pretty_xml = minidom.parseString(xml_str).toprettyxml(indent="  ")
        with open(filename, 'w') as f:
            f.write(pretty_xml)

exporter = JMeterExporter()

def request(flow: http.HTTPFlow):
    exporter.add_request(flow)

def done():
    exporter.save('output.jmx')

# 使用: mitmproxy -s mitm_to_jmx.py

配置 mitmproxy 捕获 HTTPS 流量

  1. 安装 mitmproxy CA 证书:

bash
复制
mitmproxy --set ssl_insecure=true
  1. 在客户端设备上安装证书(手机/电脑)

最佳实践建议

  1. 过滤不需要的请求

    python
    复制
    def request(flow: http.HTTPFlow):
        if "google-analytics.com" in flow.request.host:
            return
        exporter.add_request(flow)
  2. 参数化动态值

    • 在生成的 JMX 中替换 session IDs、tokens 等为 JMeter 变量

  3. 添加增强元件

    • 在 JMeter 中手动添加:

      • 定时器(Think Time)

      • 断言

      • 监听器

  4. 处理重复请求

    • 在脚本中合并相同 URL 的请求或使用 JMeter 的 "Merge Results" 功能

常见问题解决

  1. HTTPS 证书问题

    • 确保客户端信任 mitmproxy 的 CA 证书

    • 使用 --set ssl_insecure=true 忽略证书错误

  2. 乱码问题

    • 在 JMeter 的 HTTP 请求中设置正确的编码(如 UTF-8)

  3. 缺失请求体

    • 确保 mitmproxy 配置了 -b 选项以捕获请求体

通过以上方法,你可以高效地将 mitmproxy 捕获的实际用户流量转换为 JMeter 测试计划,实现更真实的性能测试场景。

posted @ 2025-03-28 01:16  小强找BUG  阅读(100)  评论(0)    收藏  举报