各位大佬好~上期内容梳理了下接口自动化脚本扩展思路,以及成果展示,本期开始就从代码角度出发。分享出源码后的同时将我的思路一并梳理出来。好了,废话不多,昊料开始~
本期先从数据入口开始,扩展脚本初期就一直在考虑,如何能不接触代码, 完完全全以界面的形式接收数据源,通过点击两个按钮,就可以实现上传需要解析的json文件,然后再点击一个按钮就去执行接口自动化脚本。想到界面就想到了窗口,于是就从网上搜索了pyqt5与python自带的tkinter的教程。综合了解了一下这两个工具包
我个人理解,pyqt5与tkinter的区别在于,pyqt5更完善,更全面,就好比django一样。有成熟的依赖,也有很好看的样式,还有第三方工具支持生成代码。tkinter就相当于flask框架。比较简陋,也比较易上手。我当前的需求就是简单实现一个窗口录入文件,然后调用脚本执行方法即可。最后把结果显示在一个对话框中。使用pyqt5一是有点大材小用,二是学习成本会有点高。所以我就选择了tkiner
于是从网上搜索相关tkinter的相关教程。总结一下我所学习到方法以及用法。如果各位大佬感兴趣,也可以继续深挖这个GUI图形界面。还是挺好玩的。
from tkinter import *
# 实例化对象
root = Tk()
# 设置窗口标题
root.title("窗口标题")
# 设置宽高以及xy轴的位置。对于新手来x与y的位置需要一点点调试。
root.geometry('1000x600+180+100')
root.mainloop()
# Label标签组件。添加一个标签在画布中
label = tk.Label(root,text ="我是一个标签").pack()
root.mainloop()
# Button按钮组件。添加一个按钮在画布中
def onclick():
print("别点我!")
root = Tk()
Button(root, text="按钮", command=onclick).pack()
root.mainloop()
root = Tk()
content = "汉皇重色思倾国,御宇多年求不得。杨家有女初长成,养在深闺人未识。" \
"天生丽质难自弃,一朝选在君王侧。回眸一笑百媚生,六宫粉黛无颜色。"
# 插入文本内容
text_area.insert(INSERT, content)
# 插入文本后需要更新一下组件
text_area.update()
root.mainloop()
root = Tk()
list_var = StringVar()
list_var.set(["go", "python", "java", "dart", "c", "c++"])
# 分别创建x方向、y方向的两个滚动条。orient属性设置其滚动方向
y_bar = Scrollbar(root, orient=VERTICAL)
x_bar = Scrollbar(root, orient=HORIZONTAL)
# 创建列表框
list_box = Listbox(root, yscrollcommand=y_bar.set,
xscrollcommand=x_bar.set,
listvariable=list_var, height=5)
y_bar['command'] = list_box.yview
x_bar['command'] = list_box.xview
# 设置布局方位
y_bar.pack(side=RIGHT, fill=Y)
x_bar.pack(side=BOTTOM, fill=X)
list_box.pack(anchor=NW, fill=BOTH, expand=YES)
root.mainloop()
以上几个方法是我最常用的。对着教程一点点边敲,边写,边练习。大概3小时就可以掌握了。下面是我脚本的源码。
import pytest
from webbrowser import open as webopen
from utils.case_utils import *
from tkinter import *
from tkinter import filedialog, ttk
from PIL import ImageTk
from PIL import Image
class ApiGui:
# 初始化画布、文本、设置背景图
def __init__(self, msg=None):
# 创建画板
self.root = Tk()
self.root.title("接口自动化工具")
# 设置长宽高以及xy轴
self.root.geometry('1000x600+180+100')
# 设置不可移动
self.root.resizable(False, False)
# 设置背景图。网上拽的一段代码。CSDN链接文末分享
self.canvas_root = Canvas(self.root, width=1000, height=600)
# 抓取异常,做了一下代码兼容。如果没有背景图,就保持空白页面窗口
try:
im_root = self.get_img(f'{get_cwd()}/picture/backgroud.jpeg', 1000, 600)
self.canvas_root.create_image(500, 300, image=im_root)
self.canvas_root.pack()
except FileNotFoundError:
self.canvas_root.pack()
# 给文本框设置下拉框
self.y_bar = Scrollbar(self.root, orient=VERTICAL)
self.y_bar.pack(side=RIGHT, fill=Y)
self.text_area = Text(self.root, yscrollcommand=self.y_bar.set, wrap=WORD, height=20)
self.y_bar["command"] = self.text_area.yview
self.text_area.place(x=200, y=200)
# 添加两个按钮。ttk是tkinter的一个UI优化包。使用时,会使窗口页面适配所运行平台,UI更好看
# 使用时,直接导入from tkinter.ttk import *即可
ttk.Button(self.root, text="请选择文件", command=self.onclick).place(x=300, y=100)
ttk.Button(self.root, text="点击开始接口自动化", command=self.pytest_main).place(x=500, y=100)
# 接受日志返回参数
if msg:
self.text_area.insert(INSERT, f"{msg}")
self.text_area.update()
self.root.mainloop()
# 背景图所用方法
def get_img(self, filename, width, height):
im = Image.open(filename).resize((width, height))
im = ImageTk.PhotoImage(im)
return im
# 点击方法,点击后弹窗打开文件选择框
def onclick(self):
"""
filedialog.askopenfilename选择文件对话框。
title为窗口标题
initialdir:默认打开的路径
filetypes:限制打开窗口的可选的文件类型
"""
self.file_name = filedialog.askopenfilename(
title="打开我的文件", initialdir="~./Desktop",
filetypes=[("JSON", ".json")])
self.text_area.insert(INSERT, "正在生成逆向测试用例\n")
self.text_area.update()
# 调用生成用例文件的方法--后面会分享
result = create_case_file(self.file_name)
if result == 200:
self.text_area.insert(INSERT, "生成完毕,请点击开始接口自动化按钮进行接口自动化操作\n")
else:
self.text_area.insert(INSERT, "接口已存在\n")
self.text_area.update()
# 执行接口自动化
def pytest_main(self):
self.text_area.insert(INSERT, "正在执行接口自动化用例\n")
self.text_area.update()
pytest.main()
self.text_area.insert(INSERT, "用例执行完成,正在生成报告\n")
self.text_area.update()
os.system("allure generate ./temps -o ./reports --clean")
self.text_area.insert(INSERT, f"报告生成完成\n")
self.text_area.update()
self.text_area.tag_configure('link',foreground='blue',underline=True)
self.text_area.insert('end','请点击我去查看报告','link')
self.text_area.tag_bind('link','<Button-1>',
lambda event: webopen("http://localhost:63342/huayuapi/reports/index.html"))
self.text_area.place()
self.text_area.update()
if __name__ == '__main__':
ApiGui()
效果图:
本期内容就到这里了。代码偏多。大家可以试着敲一下。有很多方法也是通过CSDN学习、“借鉴~”(其实就是CV。哈哈哈~)过来的。
CSDN链接:https://blog.csdn.net/qq_28949847/article/details/116936201
好了。本期内容就到这里了。下期内容就进入参数解析部分了。各位大佬,我们下期见咯~