jmeter 执行python脚本的方法 。(亲测ok)

本文详细介绍了如何在JMeter中执行Python脚本,包括下载Jython jar包、配置JMeter、使用JSR223 Sampler运行Python代码、设置响应信息及变量赋值等关键步骤。

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

jmeter 执行python脚本

 

jmeter 可以通过Jython 执:行python代码

1、下载Jython jar包:http://www.jython.org/downloads.html

2、把下载的Jython 的jar包放到 jmeter的lib文件夹。重启jmeter

3、线程组中添加 JSR223 Sampler

4、设置JSR223 Sampler

python代码

复制代码
#获取jmeter 参数
param =vars.get("param")
print "hello"
#设置响应信息
SampleResult.setResponseData("message");
SampleResult.setResponseCode("502")
SampleResult.setSuccessful(False)
复制代码

5、执行,由于代码中标记502  和执行失败,执行结果如下

 

 

来源: https://www.cnblogs.com/testway/p/9951289.html

 

后记:

试了下 下最新版本的选择不了python 估计自己的版本太低,他工具里面怎么才能使用自己本地的python有待研究

 解决了:

jmeter自己的python 调用本地下载好的python库的方法:

import sys
sys.path.append('/Users/kaibinliu/Desktop/apache-jmeter-3.3/lib/junit')

告诉他库的位置,然后正常调取使用即可

 

给变量赋值的方法

a='zzz'
vars.put('er',a)

  • vars.get(String paramStr):获得变量值

更多通用用法 见:https://www.cnblogs.com/kaibindirver/p/10984168.html

转载于:https://www.cnblogs.com/kaibindirver/p/10981313.html

<think>我们需要设计一个压平台,使用Python作为主控语言,并利用JMeter作为压引擎。平台需要支持以下功能: 1. 维护扩展施压机(slave节点):可以添加、删除施压机节点。 2. Master控制机:作为控制中心,负责分发任务、收集结果。 3. 控制远端slave机运行压脚本:在slave节点上启动JMeter服务,并执行任务。 整体架构: - Master节点:运行一个Web服务(例如使用Flask)提供API,用于管理slave节点、启动试、收集结果等。 - Slave节点:每个slave节点上需要安装JMeter,并启动JMeter的从服务器模式(slave mode)。 步骤: 1. 配置Slave节点: - 在每个slave机器上安装JMeter,并配置JMeter的远程启动(作为从服务器)。 - 启动JMeter从服务器:运行`jmeter-server`(在Unix系统)或`jmeter-server.bat`(在Windows系统)。 2. Master节点: - 需要安装JMeter,并配置远程主机列表(即slave节点的IP地址和端口,默认端口1099)。 - Master节点通过JMeter的API或者命令行工具来启动试,并指定远程slave节点。 3. 平台设计: - 使用Python编写一个控制中心,它能够: a. 管理slave节点(增删改查)。 b. 上传JMeter脚本(.jmx文件)到master节点(或者直接让slave节点能够访问到该脚本,例如通过共享存储或者从master分发)。 c. 启动试:在master节点上运行JMeter命令,指定远程slave节点执行试。 d. 收集试结果:JMeter试完成后,结果文件会保存在master节点(或者指定位置),然后我们可以读取并展示结果。 4. 关于脚本分发: - 由于JMeter在远程执行时,master会将脚本发送给slave节点,所以我们需要确保master节点上的JMeter配置了所有slave节点的IP地址(在jmeter.properties中配置remote_hosts)。 5. 使用Python控制JMeter: - 我们可以使用subprocess模块来调用JMeter的命令行。 6. 扩展性考虑: - 我们可以将slave节点的信息存储在数据库中(如SQLite),然后通过Web界面管理。 实现步骤: 1. 设计数据库表(以SQLite为例): - 表名:slaves id: INTEGER PRIMARY KEY name: TEXT ip: TEXT port: INTEGER (默认1099) status: TEXT (如:active, inactive) 2. 使用Flask创建Web服务: - 提供API接口: - GET /slaves: 获取所有slave节点 - POST /slaves: 添加slave节点 - DELETE /slaves/<id>: 删除节点 - POST /tests: 启动试(需要指定脚本和选择slave节点) 3. 启动试的逻辑: - 用户上传一个JMX文件。 - 用户选择要使用的slave节点(可以多选)。 - 将选中的slave节点拼接成一个逗号分隔的字符串(IP:PORT,IP:PORT)。 - 修改JMeter的配置文件jmeter.properties)中的remote_hosts,或者直接在命令行中指定远程主机。 - 执行命令:`jmeter -n -t <test_script.jmx> -R <slave1:port,slave2:port> -l <result_file.jtl>` - 非GUI模式运行,-n表示非GUI,-t指定脚本,-R指定远程主机列表,-l指定结果文件。 4. 结果收集: - 试完成后,将结果文件(.jtl)保存,并提供下载或解析展示。 5. 注意:JMeter在远程执行时,需要确保所有slave节点已经启动`jmeter-server`,并且防火墙设置允许1099端口(以及一个随机端口,用于数据传输)的通信。 代码结构: - app.py: Flask主程序 - config.py: 配置文件 - models.py: 数据库模型 - jmeter_controller.py: 封装JMeter操作 由于代码量较大,这里我们只实现核心部分。 首先,我们实现一个简单的Flask应用,管理slave节点,并能够启动试。 由于实际部署中,我们需要考虑JMeter的安装路径,以及如何动态修改远程主机配置,这里我们选择在启动试时通过命令行参数-R来指定远程主机,而不修改配置文件。 步骤: 1. 安装依赖:pip install flask flask_sqlalchemy 2. 创建app.py,models.py等。 详细代码: app.py: ```python from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy import subprocess import os app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' app.config['UPLOAD_FOLDER'] = 'uploads' app.config['RESULT_FOLDER'] = 'results' db = SQLAlchemy(app) # 确保上传文件夹和结果文件夹存在 os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) os.makedirs(app.config['RESULT_FOLDER'], exist_ok=True) # 定义Slave模型 class Slave(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) ip = db.Column(db.String(15), nullable=False) port = db.Column(db.Integer, default=1099) status = db.Column(db.String(10), default='inactive') # active, inactive def to_dict(self): return { 'id': self.id, 'name': self.name, 'ip': self.ip, 'port': self.port, 'status': self.status } # 创建数据库表 db.create_all() @app.route('/slaves', methods=['GET']) def get_slaves(): slaves = Slave.query.all() return jsonify([slave.to_dict() for slave in slaves]) @app.route('/slaves', methods=['POST']) def add_slave(): data = request.json slave = Slave(name=data['name'], ip=data['ip'], port=data.get('port', 1099)) db.session.add(slave) db.session.commit() return jsonify(slave.to_dict()), 201 @app.route('/slaves/<int:id>', methods=['DELETE']) def delete_slave(id): slave = Slave.query.get_or_404(id) db.session.delete(slave) db.session.commit() return '', 204 @app.route('/tests', methods=['POST']) def run_test(): # 检查上传文件 if 'file' not in request.files: return jsonify({'error': 'No file part'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'error': 'No selected file'}), 400 if not file.filename.endswith('.jmx'): return jsonify({'error': 'File must be a JMX script'}), 400 # 保存上传的脚本 file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) file.save(file_path) # 获取选中的slave节点ID列表 slave_ids = request.form.getlist('slave_ids[]') if not slave_ids: return jsonify({'error': 'No slaves selected'}), 400 # 查询slave节点 slaves = Slave.query.filter(Slave.id.in_(slave_ids)).all() if not slaves: return jsonify({'error': 'No valid slaves'}), 400 # 构建远程主机字符串 remote_hosts = ','.join([f"{slave.ip}:{slave.port}" for slave in slaves]) # 结果文件路径 result_file = os.path.join(app.config['RESULT_FOLDER'], f"result_{os.path.basename(file_path)}.jtl") # 执行JMeter命令 # 注意:这里假设jmeter命令在系统PATH中,否则需要指定完整路径 command = [ 'jmeter', '-n', # 非GUI模式 '-t', file_path, # 脚本 '-R', remote_hosts, # 远程主机 '-l', result_file # 结果文件 ] try: subprocess.run(command, check=True) return jsonify({'message': 'Test completed', 'result_file': result_file}), 200 except subprocess.CalledProcessError as e: return jsonify({'error': f'Test failed: {str(e)}'}), 500 if __name__ == '__main__': app.run(debug=True) ``` 注意:上述代码中,我们假设jmeter命令已经添加到系统PATH中。如果没有,需要指定完整路径,例如:`/path/to/jmeter/bin/jmeter`。 另外,我们通过表单上传文件,并获取选中的slave节点ID(通过表单字段'slave_ids[]')。 使用示例: 1. 启动Flask应用:`python app.py` 2. 添加slave节点:POST /slaves 携带JSON数据:{"name": "slave1", "ip": "192.168.1.100", "port": 1099} 3. 上传JMX文件并启动试:POST /tests,表单中包含文件字段'file'和多个'slave_ids[]'字段(值为slave的id)。 这个示例只是一个基础版本,实际生产环境需要考虑更多因素,例如: - 身份验证和授权 - 异步执行(长时间任务应该使用任务队列,如Celery) - 更完善的错误处理 - 结果解析和展示 - Slave节点的状态监控(可以定期检查slave节点是否在线) 由于这个示例中我们直接在主进程中运行JMeter命令,会阻塞请求,所以对于长时间试,应该使用异步任务。 改进方向: 1. 使用Celery异步任务执行JMeter命令。 2. 提供API查询试状态和结果。 相关问题: §§相关问题§§: 1. 如何确保JMeter slave节点之间的时间同步? 2. 如何扩展这个平台以支持分布式试结果的实时监控? 3. 如何动态添加和移除JMeter slave节点而不重启master服务? 4. 在使用JMeter分布式试时,如何避免网络带宽成为瓶颈?</think>下面我将详细介绍如何使用PythonJMeter构建一个分布式压平台,支持管理施压机(slave)、控制机(master)和运行压脚本。 ### 整体架构设计 ```mermaid graph TD A[Master控制机] -->|控制指令| B[Slave施压机1] A -->|控制指令| C[Slave施压机2] A -->|控制指令| D[Slave施压机3] A -->|收集结果| E[数据库] F[Web控制台] -->|操作指令| A G[JMeter脚本] -->|上传| A ``` ### 核心组件实现 #### 1. Master控制机(Python实现) ```python # master_controller.py import subprocess import paramiko import os from flask import Flask, request, jsonify app = Flask(__name__) # 施压机配置 SLAVES = [ {"ip": "192.168.1.101", "user": "user", "key": "~/.ssh/id_rsa"}, {"ip": "192.168.1.102", "user": "user", "key": "~/.ssh/id_rsa"} ] JMETER_HOME = "/opt/jmeter" RESULTS_DIR = "/results" def execute_ssh(host, command): """在远程施压机执行命令""" ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host['ip'], username=host['user'], key_filename=host['key']) stdin, stdout, stderr = ssh.exec_command(command) output = stdout.read().decode() ssh.close() return output @app.route('/start_test', methods=['POST']) def start_test(): """启动分布式试""" script = request.files['jmx'] script.save(os.path.join(JMETER_HOME, 'scripts', script.filename)) # 生成slave主机列表 slaves = ",".join([s['ip'] for s in SLAVES]) # 构建JMeter命令 cmd = f"{JMETER_HOME}/bin/jmeter -n -t {JMETER_HOME}/scripts/{script.filename} " \ f"-R {slaves} -l {RESULTS_DIR}/result.jtl" # 执行试 process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) output = process.communicate()[0] return jsonify({"status": "started", "output": output.decode()}) @app.route('/add_slave', methods=['POST']) def add_slave(): """添加新的施压机""" new_slave = request.json SLAVES.append({ "ip": new_slave['ip'], "user": new_slave['user'], "key": new_slave.get('key', '~/.ssh/id_rsa') }) return jsonify({"status": "added", "count": len(SLAVES)}) @app.route('/collect_results', methods=['GET']) def collect_results(): """收集所有施压机结果""" results = [] for slave in SLAVES: cmd = f"cat {RESULTS_DIR}/result.jtl" result = execute_ssh(slave, cmd) results.append({"slave": slave['ip'], "data": result}) return jsonify(results) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` #### 2. Slave施压机配置 ```bash # slave_setup.sh #!/bin/bash # 安装JMeter sudo apt update sudo apt install -y openjdk-11-jdk wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.3.tgz tar xzf apache-jmeter-5.4.3.tgz sudo mv apache-jmeter-5.4.3 /opt/jmeter # 配置JMeter从节点 echo "server.rmi.ssl.disable=true" >> /opt/jmeter/bin/jmeter.properties echo "server_port=1099" >> /opt/jmeter/bin/jmeter.properties # 创建结果目录 sudo mkdir /results sudo chmod 777 /results # 启动JMeter从节点服务 nohup /opt/jmeter/bin/jmeter-server > /var/log/jmeter.log 2>&1 & ``` #### 3. Web控制台(HTML/JS示例) ```html <!-- dashboard.html --> <!DOCTYPE html> <html> <body> <h1>压平台控制台</h1> <div> <h3>添加施压机</h3> IP: <input type="text" id="slave_ip"> 用户: <input type="text" id="slave_user"> <button onclick="addSlave()">添加</button> </div> <div> <h3>运行试</h3> <input type="file" id="jmx_file"> <button onclick="startTest()">开始压</button> </div> <div id="results"></div> <script> async function addSlave() { const response = await fetch('/add_slave', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ ip: document.getElementById('slave_ip').value, user: document.getElementById('slave_user').value }) }); alert(await response.text()); } async function startTest() { const file = document.getElementById('jmx_file').files[0]; const formData = new FormData(); formData.append('jmx', file); const response = await fetch('/start_test', { method: 'POST', body: formData }); const result = await response.json(); document.getElementById('results').innerText = result.output; } </script> </body> </html> ``` ### 系统工作流程 1. **施压机配置**: - 在每个Slave节点运行`slave_setup.sh`安装JMeter并启动服务 - 服务监听1099端口等待Master指令 2. **添加施压机**: - 通过Web控制台添加Slave信息到Master - Master通过SSH密钥与Slave建立信任关系 3. **执行试**: - 上传JMX脚本到Master - Master通过JMeter CLI启动分布式试 - 结果文件自动汇总到Master 4. **结果收集**: - Master通过SSH从各Slave收集结果文件 - 结果合并后展示在控制台 ### 关键技术解释 1. **JMeter分布式模式**: - `jmeter -R`参数指定远程Slave主机 - JMeter Server模式处理请求分发 2. **SSH无密码登录**: - 使用Paramiko库实现远程命令执行 - 通过SSH密钥对实现安全通信 3. **任务编排**: - Flask提供REST API接口 - 子进程执行JMeter命令 - 异步结果收集 4. **扩展性设计**: - Slave节点可动态添加/移除 - 结果存储支持多种数据库 - 支持水平扩展施压节点 ### 部署步骤 1. 在所有Slave节点运行安装脚本 2. 在Master节点启动Python服务 3. 访问Web控制台添加Slave 4. 上传JMX脚本并启动试 5. 查看汇总结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值