1、前言
在上一篇文章 [ 測(cè)試組合生成器-allpairspy ]中,作者介紹了 allpairspy 工具,用于進(jìn)行測(cè)試參數(shù)的組合。
隨后發(fā)現(xiàn),如果每次要對(duì)新的參數(shù)進(jìn)行組合,都要打開(kāi)腳本,編寫(xiě)后再執(zhí)行,之后還要手動(dòng)將參數(shù)值拷貝到 Excel 表里,還是有些麻煩,在這里應(yīng)該要如何進(jìn)行優(yōu)化,節(jié)約不必要的工作量?
本篇將此腳本進(jìn)行優(yōu)化,將集成到 Python 的 GUI 工具包(Tkinter),并且可以將結(jié)果數(shù)據(jù)導(dǎo)入到 Excel 和 TXT 文件里。
2、簡(jiǎn)介
Tkinter(即 tk interface,簡(jiǎn)稱(chēng)“Tk”)本質(zhì)上是對(duì) Tcl/Tk 軟件包的 Python 接口封裝,它是 Python 官方推薦的 GUI 工具包,屬于 Python 自帶的標(biāo)準(zhǔn)庫(kù)模塊,當(dāng)安裝好 Python 后,就可以直接使用它,而無(wú)須另行安裝。
作為一款 Python GUI 工具,Tkinter 擁有良好的跨平臺(tái)性,支持 Windows、Linux、Mac 平臺(tái),它傳承了 Python 語(yǔ)法簡(jiǎn)潔、代碼易讀的基本特點(diǎn)。
3、快速上手
使用 Tkinter GUI 工具包,快速創(chuàng)建自定義界面。
代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公眾號(hào):AllTests軟件測(cè)試
import tkinter as tk
window = tk.Tk()
# 設(shè)置窗口title
window.title('公眾號(hào):AllTests軟件測(cè)試')
# 設(shè)置窗口大小:寬x高
window.geometry('400x200')
# 獲取電腦屏幕大小
print("電腦分辨率 %dx%d " % (window.winfo_screenwidth(), window.winfo_screenheight()))
# 獲取窗口大小,必須先刷新一下屏幕
window.update()
print("窗口分辨率 %dx%d " % (window.winfo_width(), window.winfo_height()))
# 改變背景顏色
window.config(background="#B3B3B3")
# 設(shè)置窗口處于頂層
window.attributes('-topmost', True)
# 設(shè)置窗口透明度
window.attributes('-alpha', 1)
# 設(shè)置窗口被允許最大調(diào)整范圍
window.maxsize(600, 600)
# 設(shè)置窗口被允許最小調(diào)整范圍
window.minsize(50, 50)
# 更改左上角窗口icon圖標(biāo)
window.iconbitmap('C:/Users/wangmeng/Desktop/mytest/tupian.ico')
# 添加文本內(nèi)容,并對(duì)字體添加相應(yīng)的格式 font(字體,字號(hào),"字體類(lèi)型")
tk.Label(window, text="公眾號(hào):AllTests軟件測(cè)試", bg="yellow", fg="red", font=('Times', 15, 'bold italic underline')).place(x=80, y=60)
# 添加按鈕,以及按鈕的文本,并通過(guò)command參數(shù)設(shè)置關(guān)閉窗口的功能
tk.Button(window, text="關(guān)閉", command=window.quit).place(x=200, y=120)
# 進(jìn)入主循環(huán),顯示主窗口
window.mainloop()
運(yùn)行腳本,彈出 GUI 界面。
控制臺(tái)輸出獲取到的分辨率。
4、測(cè)試組合生成器腳本優(yōu)化
需求點(diǎn):一個(gè)輸入框(將參數(shù)組合輸入進(jìn)去)、一個(gè)輸出框(將參數(shù)組合分組后打印出來(lái))、分隔符下拉選擇項(xiàng)(用于匹配輸入的參數(shù)分隔符)、操作按鈕(運(yùn)行、導(dǎo)出Excel、導(dǎo)出TXT、刪除、關(guān)閉)
代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公眾號(hào):AllTests軟件測(cè)試
from tkinter import filedialog
from tkinter import ttk, scrolledtext
from tkinter import messagebox
from tkinter import *
from allpairspy import AllPairs
import datetime
import openpyxl
import os
"""
測(cè)試參數(shù)組合生成器
"""
# 獲取桌面路徑
def get_path():
return os.path.join(os.path.expanduser('~'), "Desktop")
# 退出操作
def button_quit():
window.quit()
# 刪除操作
def button_delete():
scr1.delete('0.0', END)
scr2.delete('0.0', END)
# 運(yùn)行操作
def button_run():
scr2.delete('0.0', END)
global l_key
global output_content
global export_content
l_key = []
l_value = []
output_content = []
export_content = []
# 判斷輸入數(shù)據(jù)是否為空
if scr1.get('1.0', 'end-1c') != "":
print("輸入數(shù)據(jù) " + "\\n" + scr1.get('1.0', 'end-1c'))
# 數(shù)據(jù)分割
scr_list = scr1.get('0.0', 'end-1c').split("\\n")
# 判斷是否有空值在列表中,如果有就直接通過(guò)remove刪除
while '' in scr_list:
scr_list.remove('')
print('列表數(shù)據(jù) ' + str(scr_list))
# 共有幾組數(shù)據(jù)
print(len(scr_list))
if len(scr_list) != 1:
for i in scr_list:
try:
l = i.split(srclanguage1.get())
# 因素
l_key.append(l[0].strip())
l2 = l[1].split(srclanguage2.get())
# 選擇值
l_value.append(l2)
except Exception as ex:
error = str(ex)
messagebox.showerror(title='操作錯(cuò)誤', message='運(yùn)行失敗,請(qǐng)檢查輸入數(shù)據(jù)!' + "\\n" + error)
break
print("數(shù)據(jù)參數(shù) " + str(l_value))
print("PAIRWISE:")
for i, pairs in enumerate(AllPairs(l_value)):
# 輸出內(nèi)容
output_content = "{:2d}: {}".format(i + 1, pairs)
# print(output_content)
scr2.insert(END, output_content)
scr2.insert(END, "\\n")
# 導(dǎo)出內(nèi)容
print(pairs)
export_content.append(pairs)
print(export_content)
else:
messagebox.showwarning(title='操作提示', message='輸入數(shù)據(jù)至少為2組!')
else:
messagebox.showwarning(title='操作提示', message='請(qǐng)輸入正確的數(shù)據(jù),再運(yùn)行!')
# 導(dǎo)出Excel
def button_export_excel():
excel_columns = ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1', 'M1', 'N1', 'O1',
'P1', 'Q1', 'R1', 'S1', 'T1', 'U1', 'V1', 'W1', 'X1', 'Y1', 'Z1', 'AA1', 'AB1', 'AC1',
'AD1', 'AE1', 'AF1', 'AG1', 'AH1', 'AI1', 'AJ1', 'AK1', 'AL1', 'AM1', 'AN1', 'AO1',
'AP1', 'AQ1', 'AR1', 'AS1', 'AT1', 'AU1', 'AV1', 'AW1', 'AX1', 'AY1', 'AZ1']
# 判斷輸出數(shù)據(jù)是否為空
if scr2.get('1.0', 'end-1c') != "":
print("輸出數(shù)據(jù) " + "\\n" + scr2.get('1.0', 'end-1c'))
try:
wb = openpyxl.Workbook()
sheet = wb.active
for i, j in zip(l_key, excel_columns):
sheet[j] = i
for item_tree in export_content:
value = item_tree
# print(value)
values = [str(strvalue) for strvalue in value]
# print(values)
sheet.append(values)
# 將文件直接保存到桌面
# wb.save(f'{get_path()}/case' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.xlsx')
# wb.close()
# messagebox.showinfo(title='導(dǎo)出成功', message='已將Excel文件導(dǎo)出到桌面!')
# 對(duì)話框保存文件
filepath = filedialog.asksaveasfilename(initialfile='默認(rèn)文件名.xlsx', filetypes=[("Excel文件", ".xlsx")])
if filepath != "":
# print("filepath " + filepath)
wb.save(filepath)
wb.close()
messagebox.showinfo(title='導(dǎo)出成功', message='已導(dǎo)出Excel文件!')
else:
pass
# print("filepath " + filepath)
except Exception as ex:
error = str(ex)
messagebox.showerror(title='導(dǎo)出失敗', message='導(dǎo)出失敗!' + "\\n" + error)
else:
messagebox.showwarning(title='操作提示', message='請(qǐng)先運(yùn)行后,再進(jìn)行導(dǎo)出!')
# 導(dǎo)出TXT
def button_export_txt():
# 判斷輸出數(shù)據(jù)是否為空
if scr2.get('1.0', 'end-1c') != "":
print("輸出數(shù)據(jù) " + "\\n" + scr2.get('1.0', 'end-1c'))
try:
# 將文件直接保存到桌面
# filepath = f'{get_path()}/case' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.txt'
# info_txt = "到桌面"
# 對(duì)話框保存文件
filepath = filedialog.asksaveasfilename(initialfile='默認(rèn)文件名.txt', filetypes=[("txt文件", ".txt")])
info_txt = ""
# 文件路徑是否為空
if filepath != "":
# print("filepath " + filepath)
# 寫(xiě)入文件
with open(filepath, 'w') as file_object:
file_object.write(",".join(l_key))
for item_tree in export_content:
print(",".join(item_tree))
file_object.write('\\n' + ",".join(item_tree))
file_object.close()
messagebox.showinfo(title='導(dǎo)出成功', message='已導(dǎo)出TXT文件' + info_txt + '!')
else:
pass
# print("filepath " + filepath)
except Exception as ex:
error = str(ex)
messagebox.showerror(title='導(dǎo)出失敗', message='導(dǎo)出失敗!' + "\\n" + error)
else:
messagebox.showwarning(title='操作提示', message='請(qǐng)先運(yùn)行后,再進(jìn)行導(dǎo)出!')
window = Tk()
# 設(shè)置窗口title
window.title("測(cè)試參數(shù)組合生成器")
# 設(shè)置窗口大小:寬x高
window.geometry("850x600")
srclanguage1 = StringVar()
srclanguage1.set('=')
# 標(biāo)簽
Label(window, text="因素分隔", font=("隸書(shū)", 12, 'bold')).place(x=690, y=80)
language1 = ('=', '#')
# 復(fù)選框
ttk.Combobox(window, values=language1, width=3, textvariable=srclanguage1, state='readonly').place(x=770, y=80)
srclanguage2 = StringVar()
srclanguage2.set('/')
# 標(biāo)簽
Label(window, text="內(nèi)分隔符", font=("隸書(shū)", 12, 'bold')).place(x=690, y=110)
language2 = ('/', '+')
# 復(fù)選框
ttk.Combobox(window, values=language2, width=3, textvariable=srclanguage2, state='readonly').place(x=770, y=110)
# 標(biāo)簽
Label(window, text="---輸入數(shù)據(jù)---", font=("隸書(shū)", 14, 'bold italic')).place(x=270, y=1)
# 滾動(dòng)文本框
scr1 = scrolledtext.ScrolledText(window, width=80, height=15, font=("隸書(shū)", 12))
scr1.place(x=15, y=25)
# 標(biāo)簽
Label(window, text="---輸出結(jié)果---", font=("隸書(shū)", 14, 'bold italic')).place(x=265, y=270)
# 滾動(dòng)文本框
scr2 = scrolledtext.ScrolledText(window, width=80, height=15, font=("隸書(shū)", 12))
scr2.place(x=15, y=300)
# 按鈕
button1 = Button(window, text="運(yùn)行", bg="green", font=("隸書(shū)", 15), command=button_run)
button1.place(x=560, y=560, width=80, height=30)
# 按鈕
button2 = Button(window, text="導(dǎo)出Excel", bg="yellow", font=("隸書(shū)", 15), command=button_export_excel)
button2.place(x=370, y=560, width=100, height=30)
# 按鈕
button3 = Button(window, text="導(dǎo)出TXT", bg="yellow", font=("隸書(shū)", 15), command=button_export_txt)
button3.place(x=200, y=560, width=100, height=30)
# 按鈕
button4 = Button(window, text="刪除", bg="red", font=("隸書(shū)", 15), command=button_delete)
button4.place(x=40, y=560, width=80, height=30)
# 按鈕
button5 = Button(window, text="關(guān)閉", font=("隸書(shū)", 15), command=button_quit)
button5.place(x=710, y=560, width=80, height=30)
# 標(biāo)簽
Label(window, text="輸入數(shù)據(jù)示例", font=("隸書(shū)", 12, 'bold')).place(x=690, y=350)
Label(window, text="因素=A/B/C", font=("隸書(shū)", 11)).place(x=690, y=380)
Label(window, text="因素=1/2/3", font=("隸書(shū)", 11)).place(x=690, y=410)
Label(window, text="因素=D/E/F", font=("隸書(shū)", 11)).place(x=690, y=440)
Label(window, text="公眾號(hào):AllTests軟件測(cè)試", font=("微軟雅黑", 10, 'bold'), fg='#EC3832').place(x=680, y=10)
# 顯示窗口
window.mainloop()
運(yùn)行腳本,彈出 GUI 界面。
接下來(lái)開(kāi)始簡(jiǎn)單測(cè)試一下,先準(zhǔn)備一下測(cè)試數(shù)據(jù):
品牌=X品牌/Y品牌
系統(tǒng)=Windows10/macOS
時(shí)間=按天/按周/按月/按年
將測(cè)試數(shù)據(jù)輸入到輸入框中,之后點(diǎn)擊運(yùn)行,輸出框顯示運(yùn)行后的結(jié)果,總共生成了8條用例。
點(diǎn)擊刪除按鈕,會(huì)將輸入和輸出框內(nèi)的數(shù)據(jù)都刪除掉。
點(diǎn)擊關(guān)閉按鈕,會(huì)關(guān)閉掉 GUI 界面。
代碼里可以設(shè)置將文件直接保存到桌面或者彈出對(duì)話框自定義保存,這里使用了對(duì)話框保存的方式。
點(diǎn)擊導(dǎo)出Excel,文件保存后,會(huì)提示導(dǎo)出成功。
打開(kāi)Excel,顯示的結(jié)果數(shù)據(jù)。
代碼里可以設(shè)置將文件直接保存到桌面或者彈出對(duì)話框自定義保存,這里使用了對(duì)話框保存的方式。
導(dǎo)出TXT,文件保存后,會(huì)提示導(dǎo)出成功。
打開(kāi)TXT,顯示的結(jié)果數(shù)據(jù)。
除了成功的提示信息外,也添加了一些提示與錯(cuò)誤的信息。
當(dāng)沒(méi)有輸入數(shù)據(jù),直接點(diǎn)擊運(yùn)行按鈕時(shí),會(huì)提示:
當(dāng)沒(méi)有運(yùn)行,而直接點(diǎn)擊導(dǎo)出Excel或?qū)С鯰XT時(shí),會(huì)提示:
當(dāng)輸入的參數(shù)數(shù)據(jù)只有一組時(shí),會(huì)提示:
當(dāng)輸入的數(shù)據(jù)格式不對(duì),點(diǎn)擊運(yùn)行時(shí),會(huì)提示:
如上,大概的功能點(diǎn)已經(jīng)測(cè)試完成,可以滿足所要的需求,但是還有一點(diǎn)需要改進(jìn),那就是每次打開(kāi)都要執(zhí)行腳本,需要改為直接雙擊可運(yùn)行的文件。
可以參考這篇文章 [ 將Python腳本轉(zhuǎn)換為可執(zhí)行文件 ]
步驟如下:
1、安裝 pyinstaller
2、將腳本與圖片放到同一個(gè)文件夾目錄
3、執(zhí)行轉(zhuǎn)換腳本
pyinstaller -F -i tupian.ico combination_generator.py -w
4、執(zhí)行完成后,dist目錄里是.exe可執(zhí)行文件
雙擊可執(zhí)行文件即可,自動(dòng)打開(kāi) GUI 界面。
-
TCL
+關(guān)注
關(guān)注
10文章
1715瀏覽量
88468 -
GUI
+關(guān)注
關(guān)注
3文章
648瀏覽量
39549 -
python
+關(guān)注
關(guān)注
56文章
4782瀏覽量
84453
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論