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 tkwindow = tk.tk()# 设置窗口titlewindow.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 filedialogfrom tkinter import ttk, scrolledtextfrom tkinter import messageboxfrom tkinter import *from allpairspy import allpairsimport datetimeimport openpyxlimport 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='请输入正确的数据,再运行!')# 导出exceldef 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='请先运行后,再进行导出!')# 导出txtdef 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()# 设置窗口titlewindow.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可执行文件
时识科技多核动态视觉处理器设计与开发获优胜奖
北汽蓝谷汽车 防腐和耐用性能做到了极致
多功能LED降压型恒流芯片AP2400
2011年高容量电池将逐步商品化
5G在这些行业中,网络速度、移动性和可靠性至关重要
将Python脚本集成到GUI工具包
360N5明日正式发布,与定位高端的华为荣耀V9孰强孰弱?
限流电阻的工作原理
PCB线路板塞孔工艺重要性体现在哪里?
恩智浦半导体在IBC2008展出最新基于DVB-T2的端对端
5G出现时间点已定 全球标准有望统一
Si8239x汽车隔离器简介
蓝牙5.0/网状网络新标准全面满足IoT应用
LM2002设计的8W音频功率放大电路
iPhone已经历经三轮降价降幅最高达2000多元
在机器自动化时代,会导致工人的收入下降吗
iphone8什么时候上市?iphone8最新消息:今年或许不会有iphone8了,但iphone8外观基本就这样了
VR让世界更精彩—育新机:0glasses 5G+AR展项
西部数据领先车载存储技术 赋能汽车行业智驾未来
如何制作VR模拟驾驶舱以及遥控车