最近在在弄项目的测试质量平台,平台本身是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["re