电子说
1、前言
测试组合生成器-allpairspy 中,作者介绍了 allpairspy 工具,用于进行测试参数的组合。
随后发现,如果每次要对新的参数进行组合,都要打开脚本,编写后再执行,之后还要手动将参数值拷贝到 Excel 表里,还是有些麻烦,在这里应该要如何进行优化,节约不必要的工作量?
本篇将此脚本进行优化,将集成到 Python 的 GUI 工具包(Tkinter),并且可以将结果数据导入到 Excel 和 TXT 文件里。
2、简介
Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Python 接口封装,它是 Python 官方推荐的 GUI 工具包,属于 Python 自带的标准库模块,当安装好 Python 后,就可以直接使用它,而无须另行安装。
作为一款 Python GUI 工具,Tkinter 拥有良好的跨平台性,支持 Windows、Linux、Mac 平台,它传承了 Python 语法简洁、代码易读的基本特点。
3、快速上手
使用 Tkinter GUI 工具包,快速创建自定义界面。
代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # 公众号:AllTests软件测试 import tkinter as tk window = tk.Tk() # 设置窗口title window.title('公众号:AllTests软件测试') # 设置窗口大小:宽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") # 设置窗口处于顶层 window.attributes('-topmost', True) # 设置窗口透明度 window.attributes('-alpha', 1) # 设置窗口被允许最大调整范围 window.maxsize(600, 600) # 设置窗口被允许最小调整范围 window.minsize(50, 50) # 更改左上角窗口icon图标 window.iconbitmap('C:/Users/wangmeng/Desktop/mytest/tupian.ico') # 添加文本内容,并对字体添加相应的格式 font(字体,字号,"字体类型") tk.Label(window, text="公众号:AllTests软件测试", bg="yellow", fg="red", font=('Times', 15, 'bold italic underline')).place(x=80, y=60) # 添加按钮,以及按钮的文本,并通过command参数设置关闭窗口的功能 tk.Button(window, text="关闭", command=window.quit).place(x=200, y=120) # 进入主循环,显示主窗口 window.mainloop()运行脚本,弹出 GUI 界面。
控制台输出获取到的分辨率。
4、测试组合生成器脚本优化
需求点:一个输入框(将参数组合输入进去)、一个输出框(将参数组合分组后打印出来)、分隔符下拉选择项(用于匹配输入的参数分隔符)、操作按钮(运行、导出Excel、导出TXT、删除、关闭)
代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # 公众号:AllTests软件测试 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 """ 测试参数组合生成器 """ # 获取桌面路径 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) # 运行操作 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 = [] # 判断输入数据是否为空 if scr1.get('1.0', 'end-1c') != "": print("输入数据 " + " " + scr1.get('1.0', 'end-1c')) # 数据分割 scr_list = scr1.get('0.0', 'end-1c').split(" ") # 判断是否有空值在列表中,如果有就直接通过remove删除 while '' in scr_list: scr_list.remove('') print('列表数据 ' + str(scr_list)) # 共有几组数据 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='操作错误', message='运行失败,请检查输入数据!' + " " + error) break print("数据参数 " + str(l_value)) print("PAIRWISE:") for i, pairs in enumerate(AllPairs(l_value)): # 输出内容 output_content = "{:2d}: {}".format(i + 1, pairs) # print(output_content) scr2.insert(END, output_content) scr2.insert(END, " ") # 导出内容 print(pairs) export_content.append(pairs) print(export_content) else: messagebox.showwarning(title='操作提示', message='输入数据至少为2组!') else: messagebox.showwarning(title='操作提示', message='请输入正确的数据,再运行!') # 导出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'] # 判断输出数据是否为空 if scr2.get('1.0', 'end-1c') != "": print("输出数据 " + " " + 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='导出成功', message='已将Excel文件导出到桌面!') # 对话框保存文件 filepath = filedialog.asksaveasfilename(initialfile='默认文件名.xlsx', filetypes=[("Excel文件", ".xlsx")]) if filepath != "": # print("filepath " + filepath) wb.save(filepath) wb.close() messagebox.showinfo(title='导出成功', message='已导出Excel文件!') else: pass # print("filepath " + filepath) except Exception as ex: error = str(ex) messagebox.showerror(title='导出失败', message='导出失败!' + " " + error) else: messagebox.showwarning(title='操作提示', message='请先运行后,再进行导出!') # 导出TXT def button_export_txt(): # 判断输出数据是否为空 if scr2.get('1.0', 'end-1c') != "": print("输出数据 " + " " + 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 = "到桌面" # 对话框保存文件 filepath = filedialog.asksaveasfilename(initialfile='默认文件名.txt', filetypes=[("txt文件", ".txt")]) info_txt = "" # 文件路径是否为空 if filepath != "": # print("filepath " + filepath) # 写入文件 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(' ' + ",".join(item_tree)) file_object.close() messagebox.showinfo(title='导出成功', message='已导出TXT文件' + info_txt + '!') else: pass # print("filepath " + filepath) except Exception as ex: error = str(ex) messagebox.showerror(title='导出失败', message='导出失败!' + " " + error) else: messagebox.showwarning(title='操作提示', message='请先运行后,再进行导出!') window = Tk() # 设置窗口title window.title("测试参数组合生成器") # 设置窗口大小:宽x高 window.geometry("850x600") srclanguage1 = StringVar() srclanguage1.set('=') # 标签 Label(window, text="因素分隔", font=("隶书", 12, 'bold')).place(x=690, y=80) language1 = ('=', '#') # 复选框 ttk.Combobox(window, values=language1, width=3, textvariable=srclanguage1, state='readonly').place(x=770, y=80) srclanguage2 = StringVar() srclanguage2.set('/') # 标签 Label(window, text="内分隔符", font=("隶书", 12, 'bold')).place(x=690, y=110) language2 = ('/', '+') # 复选框 ttk.Combobox(window, values=language2, width=3, textvariable=srclanguage2, state='readonly').place(x=770, y=110) # 标签 Label(window, text="---输入数据---", font=("隶书", 14, 'bold italic')).place(x=270, y=1) # 滚动文本框 scr1 = scrolledtext.ScrolledText(window, width=80, height=15, font=("隶书", 12)) scr1.place(x=15, y=25) # 标签 Label(window, text="---输出结果---", font=("隶书", 14, 'bold italic')).place(x=265, y=270) # 滚动文本框 scr2 = scrolledtext.ScrolledText(window, width=80, height=15, font=("隶书", 12)) scr2.place(x=15, y=300) # 按钮 button1 = Button(window, text="运行", bg="green", font=("隶书", 15), command=button_run) button1.place(x=560, y=560, width=80, height=30) # 按钮 button2 = Button(window, text="导出Excel", bg="yellow", font=("隶书", 15), command=button_export_excel) button2.place(x=370, y=560, width=100, height=30) # 按钮 button3 = Button(window, text="导出TXT", bg="yellow", font=("隶书", 15), command=button_export_txt) button3.place(x=200, y=560, width=100, height=30) # 按钮 button4 = Button(window, text="删除", bg="red", font=("隶书", 15), command=button_delete) button4.place(x=40, y=560, width=80, height=30) # 按钮 button5 = Button(window, text="关闭", font=("隶书", 15), command=button_quit) button5.place(x=710, y=560, width=80, height=30) # 标签 Label(window, text="输入数据示例", font=("隶书", 12, 'bold')).place(x=690, y=350) Label(window, text="因素=A/B/C", font=("隶书", 11)).place(x=690, y=380) Label(window, text="因素=1/2/3", font=("隶书", 11)).place(x=690, y=410) Label(window, text="因素=D/E/F", font=("隶书", 11)).place(x=690, y=440) Label(window, text="公众号:AllTests软件测试", font=("微软雅黑", 10, 'bold'), fg='#EC3832').place(x=680, y=10) # 显示窗口 window.mainloop()运行脚本,弹出 GUI 界面。
接下来开始简单测试一下,先准备一下测试数据:
品牌=X品牌/Y品牌 系统=Windows10/macOS 时间=按天/按周/按月/按年
将测试数据输入到输入框中,之后点击运行,输出框显示运行后的结果,总共生成了8条用例。
点击删除按钮,会将输入和输出框内的数据都删除掉。
点击关闭按钮,会关闭掉 GUI 界面。
代码里可以设置将文件直接保存到桌面或者弹出对话框自定义保存,这里使用了对话框保存的方式。
点击导出Excel,文件保存后,会提示导出成功。
打开Excel,显示的结果数据。
代码里可以设置将文件直接保存到桌面或者弹出对话框自定义保存,这里使用了对话框保存的方式。
导出TXT,文件保存后,会提示导出成功。
打开TXT,显示的结果数据。
除了成功的提示信息外,也添加了一些提示与错误的信息。
当没有输入数据,直接点击运行按钮时,会提示:
当没有运行,而直接点击导出Excel或导出TXT时,会提示:
当输入的参数数据只有一组时,会提示:
当输入的数据格式不对,点击运行时,会提示:
如上,大概的功能点已经测试完成,可以满足所要的需求,但是还有一点需要改进,那就是每次打开都要执行脚本,需要改为直接双击可运行的文件。
步骤如下:
1、安装 pyinstaller
2、将脚本与图片放到同一个文件夹目录
3、执行转换脚本
pyinstaller -F -i tupian.ico combination_generator.py -w
4、执行完成后,dist目录里是.exe可执行文件
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !