python解析jmx完成jmeter压力测试

本文介绍了如何在Python环境下解析JMX文件并利用JMeter进行压力测试。首先,通过Django+Vue搭建的测试质量平台触发压力测试,将测试参数发送到MQ。然后,压力机消费MQ消息,生成JMX文件并执行。测试完成后,将JTL文件转换为CSV,并存入数据库以供平台展示结果。这种方法便于快速部署和后续功能扩展,如多集群压力测试和监控主机状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在在弄项目的测试质量平台,平台本身是django+vue搭建的,缺少 一个性能压测的小模块,所以着手处理了了下,其实第一选择应该 是locust,因为locust本身就是基于python的性能测试 框架,可能跟平台本身更加契合,但在实际的测试和体验后,发现其实使用并不理想,占用内存大,数据指标也并不准确。后来觉得还是用jmeter处理下可能更稳妥些。

大体的思路如下 :

1、点击平台内case列表执行按键,将case相关信息如(线程数,持续时间,请求 方式、参数等)发送 至mq

2、压力机内mq进行消费 读取case信息,将信息写入jmeter的JMX文件内,执行该JMX文件

3、生成结果后,因为jmeter生成报告的方式是内部引用变量,无法从某个节点取到对应数值,所以要将生成的jtl文件转为csv文件

4、最后将csv文件写入数据库,平台列表展示case关联压测结果

import time, pika, os, json, subprocess, csv, pymysql, logging
import xml.etree.cElementTree as ET
from urllib import parse

LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"  # 日志格式化输出
DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p"  # 日期格式
fp = logging.FileHandler('performance.log', encoding='utf-8')
fs = logging.StreamHandler()
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT, handlers=[fp, fs])


# jmeter  基本信息
currpath = os.path.dirname(os.path.realpath(__file__))

JMETER_PLUGIN_NAME = r'''"E:\自动化\jmeter\apache-jmeter-3.1\apache-jmeter-3.1\lib\ext\CMDRunner.jar"'''

JMETER_HOME = r'''"E:\自动化\jmeter\apache-jmeter-3.1\apache-jmeter-3.1\bin\jmeter.bat"'''

JMETER_EXEC_JMX = "excutePerformance.jmx"

JMETER_TEMPLATES_JMX = "templatesPerformance.jmx"

# rabbitmq 配置信息
MQ_CONFIG = {
    "host": "",
    "port": 5672,
    "vhost": "/",
    "user": "admin",
    "passwd": "admin",
}


# mq 消费端
def consume():
    # 创建连接
    credentials = pika.PlainCredentials(MQ_CONFIG["user"], MQ_CONFIG["passwd"])
    conn_broker = pika.BlockingConnection(
        pika.ConnectionParameters(host=MQ_CONFIG["host"], port=MQ_CONFIG["port"], virtual_host=MQ_CONFIG["vhost"],
                                  credentials=credentials))

    # 在连接上创建一个频道
    chan = conn_broker.channel()
    chan.queue_declare(queue='performanceQueue')
    chan.basic_consume('performanceQueue', callback, auto_ack=True)
    chan.start_consuming()


# 解析执行mq数据
def callback(ch, method, properties, body):
    strBody = body.decode('gbk').replace("'", '"')
    requestDic = json.loads(strBody)
    if handleTemplates(requestDic):
        execjmxs(requestDic["case_per_result_id"])


# 将mq信息写入jmx文件
def handleTemplates(requestDic):
    try:
        logging.info("将mq信息写入jmx模板")
        # 基本信息
        url = parse.urlparse(requestDic["request"]["host"])
        HTTPSampler_domain = url.netloc
        HTTPSampler_protocol = url.scheme
        HTTPSampler_path = requestDic["request"]["path"]
        HTTPSampler_method = requestDic["request"]["method"]
        HTTPSampler_params = requestDic["request"]["params"]
        HTTPSampler_body = requestDic["request"]["data"]
        HTTPSampler_headers = requestDic["request"]["he
<think>好的,用户之前询问了关于pymeter添加结果断言的问题,现在他们想了解如何用PythonJMeter进行接口性能测试,并希望得到示例代码。我需要先回顾之前的对话,确保这次的回答能衔接上。用户可能已经对pymeter有一定了解,所以这次可能需要结合JMeterPython的使用方法。 首先,我需要确定用户的具体需求。他们提到的是“PythonJMeter”实现接口性能测试,可能是指如何将PythonJMeter结合起来,或者是否有一种方法可以借助Python来编写JMeter测试脚本。但JMeter本身是用Java开发的,通常使用GUI或XML格式的JMX文件来设计测试计划。不过,用户可能希望用Python生成或控制JMeter的测试计划,或者寻找类似JMeterPython库。 根据用户之前的问题,他们可能已经接触过pymeter这个库,pymeter可能是一个用于性能测试的Python库,类似于JMeter的功能。之前的回答中提到了使用pymeter的HttpSampler、断言等,所以用户可能希望继续用pymeter来实现类似JMeter的性能测试,或者需要知道如何将Python脚本与JMeter集成。 但问题中的关键词是“PythonJMeter”,这可能意味着两种不同的工具的结合使用。例如,使用Python生成JMeter的测试脚本(JMX文件),或者用Python调用JMeter的命令行来执行测试。或者用户可能误解了,其实是想用Python的库来替代JMeter,但需要类似的功能。 接下来,我需要确认可能的解决方案。如果用户想用Python编写类似JMeter的性能测试脚本,可能需要介绍一些Python的性能测试框架,如Locust,或者继续使用pymeter。但如果用户确实需要将PythonJMeter结合,可能需要解释如何通过Python调用JMeter的命令行工具,或者生成JMX文件,或者使用JMeter的API。 例如,JMeter可以通过命令行执行,用户可以用Python的subprocess模块调用JMeter命令,并传递JMX测试计划。同时,Python可以用于生成JMX文件(XML格式),或者处理测试结果。或者,用户可能希望用Python编写测试逻辑,而用JMeter来执行压力测试。 另外,考虑到用户之前的问题是关于pymeter的断言,可能他们更倾向于使用pymeter库来编写性能测试脚本,而误以为需要结合JMeter。这时候需要确认pymeter是否支持性能测试,或者是否只是一个用于功能测试的库。如果pymeter支持性能测试,那么可以继续给出使用pymeter的示例;否则,可能需要介绍其他工具如Locust,并结合JMeter的使用。 根据用户的问题,他们可能想要一个使用PythonJMeter进行性能测试的示例。可能的实现方式包括: 1. 使用Python生成JMeterJMX文件,然后通过命令行运行JMeter。 2. 使用Python的requests库进行接口测试,但这不是性能测试,因为requests是同步的,不适合高并发。 3. 使用Python的性能测试框架如Locust,并结合JMeter进行对比。 4. 使用pymeter库,如果它支持性能测试的话。 在之前的回答中,用户得到了关于pymeter的示例,所以可能用户希望继续使用pymeter来模拟JMeter的功能。需要检查pymeter是否支持多线程、并发请求等性能测试功能。如果pymeter支持创建线程组、设置并发用户数、循环次数等,那么可以给出使用pymeter的示例代码。否则,可能需要转向其他方法,比如使用Locust,或者用Python调用JMeter。 根据之前的示例代码,用户可能更倾向于使用pymeter,所以可能需要给出一个使用pymeter进行性能测试的示例,包括线程组、循环次数、定时器等设置,并生成报告。 但问题中的“PythonJMeter”可能意味着用户希望将两者结合起来,比如用Python脚本驱动JMeter执行测试。这种情况下,可能需要给出如何用Python调用JMeter的命令行,生成测试报告,并解析结果。 需要平衡这两种可能性。可能需要先介绍两种方法:一种是使用纯Python库(如pymeter或Locust)进行性能测试,另一种是PythonJMeter的结合使用。 现在,我需要组织回答的结构: 1. 说明PythonJMeter结合的可能方法,如Python生成JMX,调用JMeter命令行。 2. 给出一个示例,用Python生成JMX文件,或者调用JMeter执行测试。 3. 另外,介绍使用纯Python库(如Locust)进行性能测试的示例,作为替代方案。 4. 比较两种方法的优缺点,帮助用户选择适合的方式。 但用户明确要求的是PythonJMeter的实现,所以可能需要重点放在第一种方法上。例如,使用Python的subprocess运行JMeter命令行工具,或者使用JMeter的Ant任务,并用Python脚本控制。 此外,用户可能需要示例代码,所以需要给出具体的Python脚本,例如: - 使用Python生成JMX测试计划。 - 使用Python调用jmeter -n -t test.jmx -l result.jtl。 - 使用Python解析JMeter的结果文件(如.jtl)。 但是,手动生成JMX文件比较麻烦,因为JMX是XML格式,结构复杂。替代方案是使用JMeter的API,例如使用JMeter的Java API,但用Python调用可能不太方便。因此,更实际的可能是用Python调用JMeter的命令行,并处理结果。 例如,示例代码可能包括: 1. 编写一个JMX测试计划(可能手动或用JMeter GUI创建)。 2. 使用Python的subprocess模块启动JMeter测试。 3. 使用Python分析生成的测试结果。 但用户可能需要更集成的示例,例如如何用Python脚本动态生成测试计划,然后执行。 然而,这可能比较复杂。因此,可能需要另一种方式,即使用Locust(Python编写的性能测试工具)作为替代方案,这样用户可以用纯Python编写性能测试脚本,而无需使用JMeter。 在这种情况下,回答可能需要分两部分:Python调用JMeter的方法,以及使用Python原生工具(如Locust)进行性能测试的示例。 根据用户的问题,他们可能更希望得到具体的代码示例,所以需要给出两种可能的解决方案,并比较它们的优缺点。 最后,考虑到用户之前的问题是关于pymeter的,可能他们更希望了解如何用pymeter实现性能测试,但不确定pymeter是否支持。需要查阅pymeter的文档,确认其是否支持线程组、并发用户等性能测试功能。如果支持,则可以给出示例;如果不支持,可能需要建议其他工具。 例如,在之前的回答中,用户给出的pymeter示例包含ThreadGroup,这可能意味着pymeter支持模拟多线程,因此可以用于性能测试。因此,可能继续使用pymeter库来编写性能测试脚本,设置线程数、循环次数等,并生成报告。 总结,可能的回答结构: 1. 使用pymeter库进行性能测试(如果支持的话),给出示例代码。 2. 使用Python调用JMeter命令行工具,给出示例代码。 3. 推荐其他Python性能测试框架,如Locust,并给出示例。 需要确认pymeter是否支持性能测试所需的并发用户设置。在之前的示例中,用户提到了ThreadGroup,这类似于JMeter的线程组,因此可能pymeter可以用于创建并发用户,执行多个请求,从而进行性能测试。 因此,可能优先给出使用pymeter的示例,展示如何设置线程数、循环次数、定时器等,并运行测试计划,收集结果。这样用户可以利用之前的知识,延续使用pymeter。 同时,作为另一种方法,可以简要介绍如何用Python调用JMeter的命令行工具,例如生成JMX文件后通过subprocess执行JMeter命令,但可能代码示例较为复杂,需要JMX文件的模板或动态生成。 最终,可能给出两种方法,但以pymeter为主,或者根据实际情况选择。 现在需要验证pymeter是否支持性能测试的设置。根据之前的示例代码,用户使用了ThreadGroup,这通常用于模拟并发用户,因此可以推测pymeter支持性能测试。例如: ThreadGroup可能是设置线程数(用户数)、循环次数、启动时间等参数。因此,示例代码可以包括如何配置这些参数,从而进行性能测试。 因此,回答可能包括: - 使用pymeter创建线程组,设置线程数、循环次数。 - 添加HTTP请求采样器。 - 添加定时器(如思考时间)。 - 运行测试并生成报告。 示例代码可能如下: ```python from pymeter.api import TestPlan, ThreadGroup, ConstantTimer from pymeter.api.samplers import HttpSampler http_sampler = HttpSampler("Example Request", "https://api.example.com/data") # 创建定时器(例如,每个请求后等待500毫秒) timer = ConstantTimer(500) # 创建线程组,设置10个线程,循环5次,每个请求后添加定时器 thread_group = ThreadGroup( num_threads=10, iterations=5, children=[http_sampler, timer] ) # 创建测试计划并运行 test_plan = TestPlan(thread_group) test_plan.run() ``` 同时,可以提到如何生成HTML报告,或者使用监听器来收集结果。 如果pymeter支持生成报告,则可以进一步说明。否则,可能需要用户自行处理结果。 此外,可能还需要比较pymeter与JMeter的优缺点,例如pymeter适合用Python编写测试脚本,而JMeter有更丰富的功能和社区支持。 另外,考虑到用户的问题是关于“PythonJMeter”的结合使用,可能需要补充说明如何用Python脚本调用JMeter,例如: ```python import subprocess # 指定JMeter路径和测试计划 jmeter_path = "/path/to/jmeter/bin/jmeter" test_plan = "test.jmx" result_file = "results.jtl" # 执行JMeter命令行测试 subprocess.run([jmeter_path, "-n", "-t", test_plan, "-l", result_file]) # 可选的:使用Python解析结果文件 import pandas as pd results = pd.read_csv(result_file, delimiter=",") print(results.describe()) ``` 但这需要用户已经有一个JMX测试计划,可能不够完整。因此,可能建议用户使用JMeter GUI创建测试计划,然后通过Python调用执行,并分析结果。 综合以上思路,回答应覆盖两种方法:使用pymeter库进行纯Python性能测试,以及使用Python驱动JMeter执行测试。同时,可能需要提到其他工具如Locust作为替代方案,供用户选择。</think>在接口性能测试中,Python 可与 JMeter 结合使用,通常通过 **Python 控制 JMeter 执行测试计划**或 **使用 Python 原生库(如 `Locust`)替代 JMeter**。以下是两种方法的示例: --- ### **方法 1:Python 调用 JMeter 执行性能测试** 通过 Python 脚本生成 JMeter 测试计划(JMX 文件)并调用 JMeter 命令行运行。 #### **步骤与示例代码** 1. **手动创建 JMX 测试计划** 使用 JMeter GUI 设计测试逻辑(如线程组、HTTP 请求、断言等),保存为 `test_plan.jmx`。 2. **Python 调用 JMeter 命令行执行测试** ```python import subprocess # 定义 JMeter 路径和参数 jmeter_path = "/path/to/jmeter/bin/jmeter" # JMeter 安装路径 jmx_file = "test_plan.jmx" # 测试计划文件 result_file = "results.jtl" # 结果输出文件 # 执行 JMeter 命令行测试 cmd = [ jmeter_path, "-n", # 非 GUI 模式 "-t", jmx_file, # 指定测试计划 "-l", result_file, # 保存结果到文件 "-e", # 生成 HTML 报告(可选) "-o", "report" # HTML 报告目录(可选) ] subprocess.run(cmd) # 解析结果文件(示例:统计响应时间) import pandas as pd results = pd.read_csv(result_file, delimiter=",") print("平均响应时间(ms):", results["elapsed"].mean()) ``` --- ### **方法 2:使用 Python 原生工具(如 Locust)实现性能测试** `Locust` 是 Python 编写的性能测试框架,可直接用代码定义用户行为和并发逻辑。 #### **示例代码** ```python from locust import HttpUser, task, between class ApiUser(HttpUser): wait_time = between(1, 3) # 用户每次请求的间隔时间(秒) @task def test_api(self): # 发送 GET 请求 self.client.get("/data") # 发送 POST 请求(带 JSON 参数) self.client.post("/submit", json={"key": "value"}) # 可选:设置全局钩子(如测试启动/结束逻辑) def on_start(self): self.client.headers = {"Authorization": "Bearer token"} # 运行命令(终端执行): # locust -f script.py --headless -u 100 -r 10 --host=https://api.example.com ``` #### **关键参数** - `-u 100`:模拟 100 个并发用户。 - `-r 10`:每秒启动 10 个用户。 - `--host`:目标接口域名。 - `--headless`:无 GUI 模式(适合自动化)。 --- ### **方法对比** | **方法** | **优点** | **缺点** | |----------------|---------------------------------------|---------------------------------------| | **Python + JMeter** | 复用 JMeter 生态(丰富的监听器、插件) | 依赖 JMeter 环境,需手动维护 JMX 文件 | | **Locust** | 纯 Python 代码,灵活易扩展 | 报告和高级功能不如 JMeter 完善 | --- ### **选择建议** - 若需 **复杂场景或企业级报告**,优先使用 JMeter + Python 自动化调用。 - 若需 **快速编写脚本或与 CI/CD 集成**,推荐使用 Locust 或其他 Python 库(如 `pymeter`)。 可根据实际需求选择最适合的方案!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值