JMeterHTML報告腳本
- JMeterHtml報告腳本
- 展示
- 代碼
- 備注
JMeterHtml報告腳本
每次生成報告都要黑視窗敲命令,比較麻煩,閑暇之余寫個小GUI腳本
展示
1.選擇好路徑之后點擊“生成報告”


2.查看報告,瀏覽器打開報告檔案


代碼
#_*_coding:utf-8_*_
import json
import tkinter
from tkinter import filedialog # 這個是檔案選擇
import tkinter.messagebox # 這個是訊息框,對話框的關鍵
import datetime
import os
os.system('chcp 65001')
configPath = {
"JMeterBin": "E:/apache-jmeter-5.4.1/bin",
"JMeterReport": "C:/Users/59209/Desktop/JMeterHtmlReport"
}
class Layout(object):
def __init__(self):
# 創建主視窗,用于容納其它組件
self.root = tkinter.Tk()
# 獲取螢屏長寬
windowsWidth = self.root.winfo_screenwidth()
windowsHight = self.root.winfo_screenheight()
# 指定視窗大小
Width = 460
Hight = 200
# 設定視窗居中展示
x = (windowsWidth - Width) / 2
y = (windowsHight - Hight) / 2
self.root.geometry("%dx%d+%d+%d" % (Width, Hight, x, y))
# 給主視窗設定標題內容
self.root.title("JMeterHTML報告")
# # 創建標簽+輸入框+按鈕
# 1.1 #----JMeterBin路徑------標簽
self.JMeterBinPath = tkinter.Label(self.root, text="JMeterBin路徑:", width=15)
# 1.2 #----JMeterBin路徑------輸入框
JMeterBinPath = tkinter.StringVar(value=configPath["JMeterBin"])
self.JMeterBinPath_input = tkinter.Entry(self.root, width=30, textvariable=JMeterBinPath)
# 1.3 #----JMeterBin路徑------按鈕
self.JMeterBinPath_button = tkinter.Button(self.root, text="選擇", width=15, height=1,
command=lambda: self.act("JMeterBinPath_button"))
# 2.1 #----JMeterJmx路徑------標簽
self.JMeterJmxPath = tkinter.Label(self.root, text="JMeterJmx路徑:", width=15)
# 2.2 #----JMeterJmx路徑------輸入框
self.JMeterJmxPath_input = tkinter.Entry(self.root, width=30)
# 2.3 #----JMeterJmx路徑------按鈕
self.JMeterJmxPath_button = tkinter.Button(self.root, text="選擇", width=15, height=1,
command=lambda: self.act("JMeterJmxPath_button"))
# 3.1 #----JMeterReport路徑------標簽
self.JMeterReportPath = tkinter.Label(self.root, text="JHTML報告路徑:", width=15)
# 3.2 #----JMeterReport路徑------輸入框
JMeterReportPath = tkinter.StringVar(value=configPath["JMeterReport"])
self.JMeterReportPath_input = tkinter.Entry(self.root, width=30, textvariable=JMeterReportPath)
# 3.3 #----JMeterReport路徑------按鈕
self.JMeterReport_button = tkinter.Button(self.root, text="選擇", width=15, height=1,
command=lambda: self.act("JMeterReport_button"))
# 創建生成報告按鈕
self.MakeReport_button = tkinter.Button(self.root, text="生成報告", width=15, height=1,
command=lambda: self.act("MakeReport_button"))
# 創建查看報告按鈕
self.ReadReport_button = tkinter.Button(self.root, text="查看報告", width=15, height=1,
command=lambda: self.act("ReadReport_button"))
# 完成布局
def gui_arrang(self):
self.JMeterBinPath.grid(row=0, column=0, sticky='w', pady=10) # sticky='w'指定了組件在單元格中靠左對齊
self.JMeterBinPath_input.grid(row=0, column=1, pady=10)
self.JMeterBinPath_button.grid(row=0, column=3, padx=15, pady=10)
self.JMeterReportPath.grid(row=1, column=0, sticky='w', pady=10) # sticky='w'指定了組件在單元格中靠左對齊
self.JMeterReportPath_input.grid(row=1, column=1, pady=10)
self.JMeterReport_button.grid(row=1, column=3, padx=15, pady=10)
self.JMeterJmxPath.grid(row=2, column=0, sticky='w', pady=10) # sticky='w'指定了組件在單元格中靠左對齊
self.JMeterJmxPath_input.grid(row=2, column=1, pady=10)
self.JMeterJmxPath_button.grid(row=2, column=3, padx=15, pady=10)
self.MakeReport_button.grid(row=3, column=0, rowspan=3, columnspan=5, padx=15, pady=10)
self.ReadReport_button.grid(row=5, column=3, rowspan=3, columnspan=5, padx=15, pady=10)
def act(self, buttonName):
self.inputList = [self.JMeterBinPath_input, self.JMeterJmxPath_input, self.JMeterReportPath_input]
if buttonName == "JMeterBinPath_button":
folderPath = filedialog.askdirectory()
self.inputList[0].delete(0, tkinter.END)
self.inputList[0].insert(0, folderPath)
# if data["JMeterBin"] != folderPath:
# ReadConfig("config.json").wrid_json("JMeterBin", folderPath)
# else:
# pass
elif buttonName == "JMeterJmxPath_button":
folderPath = filedialog.askopenfilename(filetypes=[('JMX', 'jmx')])
self.inputList[1].delete(0, tkinter.END)
self.inputList[1].insert(0, folderPath)
elif buttonName == "JMeterReport_button":
folderPath = filedialog.askdirectory()
self.inputList[2].delete(0, tkinter.END)
self.inputList[2].insert(0, folderPath)
# if ReadConfig("config.json").read_json()["JMeterReport"] != folderPath:
# ReadConfig("config.json").wrid_json("JMeterReport", folderPath)
# else:
# pass
elif buttonName == "MakeReport_button":
# 獲取三個路徑值
JMeterBinPath = self.inputList[0].get()
JMeterJmxPath = self.inputList[1].get()
JMeterReportPath = self.inputList[2].get()
if JMeterBinPath == "" or JMeterJmxPath == "" or JMeterReportPath == "":
tkinter.messagebox.showinfo('提示', '請正確選擇路徑!')
else:
# 獲取Bin目錄的根磁盤
cdBinRootPath = JMeterBinPath[0] + ":"
# 移動至Bin目錄
cdBinPath = "cd " + JMeterBinPath
# 生成Html報告命令
nowTime = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 時間戳
makeReport = "jmeter -n -t " + JMeterJmxPath + " -l " + JMeterReportPath + "/report-" + nowTime + "/report.jtl -e -o " + JMeterReportPath + "/report-" + nowTime + " 2>&1"
# print(os.popen("C: & cd C:/Jmeter/apache-jmeter-5.2/bin & jmeter -n -t C:/Users/jinxiao.lu/Desktop/JMeter/察看結果樹.jmx -l C:/Users/jinxiao.lu/Desktop/JMeter/test.jtl -e -o C:/Users/jinxiao.lu/Desktop/JMeter/report"))
content = os.popen(cdBinRootPath + "&" + cdBinPath + "&" + makeReport).read()
print(content)
BinPathEorr = "'jmeter' is not recognized as an internal or external command"
if "... end of run" in content:
tkinter.messagebox.showinfo('提示', '生成報告成功')
# ReadConfig("config.json").wrid_json("JMeterBin", JMeterBinPath)
# ReadConfig("config.json").wrid_json("JMeterReport", JMeterReportPath)
elif BinPathEorr in content:
tkinter.messagebox.showerror('錯誤', "JMeterBin路徑錯誤!")
else:
tkinter.messagebox.showerror('錯誤', '出錯了\n' + content)
elif buttonName == "ReadReport_button":
JMeterReportPath = self.inputList[2].get()
os.startfile(JMeterReportPath)
else:
print("按鈕名字錯誤")
class ReadConfig(object):
def __init__(self, filename):
self.filepath = "../config/" + filename
def read_json(self):
with open(self.filepath, "r", encoding="utf-8") as f:
# 呼叫load方法加載檔案流
return json.load(f)
def wrid_json(self, pathKey, pathVarlue):
# 加載Json資料
# 替換路徑值
for key in configPath:
if pathKey == key:
configPath[key] = pathVarlue
return configPath
def main():
# 初始化物件
Report = Layout()
# 進行布局
Report.gui_arrang()
# 主程式執行
tkinter.mainloop()
if __name__ == "__main__":
main()
備注
1.由于在我本地是有其他檔案設定其他功能模塊的,所以代碼里會多于一些方法,但不影響生成報告的使用
2.將上述代碼復制粘貼成.py檔案執行時會帶黑視窗,只需要將后綴改為.pyw就可以隱藏黑視窗
3.水平有限,本人學習記錄,僅當可以參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/335532.html
標籤:其他
