zl程序教程

您现在的位置是:首页 >  Java

当前栏目

测试之路 pytest接口自动化框架扩展-GUI窗口

2023-02-18 16:23:12 时间

各位大佬好~上期内容梳理了下接口自动化脚本扩展思路,以及成果展示,本期开始就从代码角度出发。分享出源码后的同时将我的思路一并梳理出来。好了,废话不多,昊料开始~

引言

本期先从数据入口开始,扩展脚本初期就一直在考虑,如何能不接触代码, 完完全全以界面的形式接收数据源,通过点击两个按钮,就可以实现上传需要解析的json文件,然后再点击一个按钮就去执行接口自动化脚本。想到界面就想到了窗口,于是就从网上搜索了pyqt5与python自带的tkinter的教程。综合了解了一下这两个工具包

我个人理解,pyqt5与tkinter的区别在于,pyqt5更完善,更全面,就好比django一样。有成熟的依赖,也有很好看的样式,还有第三方工具支持生成代码。tkinter就相当于flask框架。比较简陋,也比较易上手。我当前的需求就是简单实现一个窗口录入文件,然后调用脚本执行方法即可。最后把结果显示在一个对话框中。使用pyqt5一是有点大材小用,二是学习成本会有点高。所以我就选择了tkiner

于是从网上搜索相关tkinter的相关教程。总结一下我所学习到方法以及用法。如果各位大佬感兴趣,也可以继续深挖这个GUI图形界面。还是挺好玩的。

tkinter
  • 导包并创建Tk()对象
  • 实例化Tk()对象就等于创建了一个画布,我们在这个画布上进行“创作”即可
  • PS:最后结尾需要调用mainloop这个方法。这个方法可以看做死循环,可以对画布中的操作重复无数遍。指导你退出程序。就如同我们使用软件一样。所有软件都是重复使用的,不可能只操作一次就退出了。
from tkinter import *
# 实例化对象
root = Tk()

# 设置窗口标题
root.title("窗口标题")

# 设置宽高以及xy轴的位置。对于新手来x与y的位置需要一点点调试。
root.geometry('1000x600+180+100')

root.mainloop()
  • 总结一下我所用到的组件和方法:
    • Label:一个标签组件。主要用来实现显示功能,可以显示文字和图片。参数如下
      • parent: 代表承载该按钮的父容器.
      • options: 可选项,即该按钮的可设置的属性。这些选项可以用键 =值的形式设置,并以逗号分隔
    • pack:布局函数。布局。添加组件后调用该方法,才能将组件放入画板中。tkinter还有两个布局函数--grid和place。
# Label标签组件。添加一个标签在画布中
label = tk.Label(root,text ="我是一个标签").pack() 

root.mainloop()
  • Button:一个简单的按钮,用来响应用户的一个点击操作。能够与一个函数关联,当按钮被按下时,自动调用该函数。属性可以直接参考标签
  • ps:tkinter的组件有很多通用属性。感兴趣的可以CSDN刷一波
# Button按钮组件。添加一个按钮在画布中
def onclick():
    print("别点我!")

root = Tk()
Button(root, text="按钮", command=onclick).pack()

root.mainloop()
  • Text:文本控件,是非常灵活复杂的控件,既可以插入文字,还能插入图片和其他小控件
root = Tk()
content = "汉皇重色思倾国,御宇多年求不得。杨家有女初长成,养在深闺人未识。" \
          "天生丽质难自弃,一朝选在君王侧。回眸一笑百媚生,六宫粉黛无颜色。"

# 插入文本内容
text_area.insert(INSERT, content)
# 插入文本后需要更新一下组件
text_area.update()
root.mainloop()
  • Scrollbar:文本滚动条
    • command:滚动条拖动时的回调监听,其属性值是一个回调函数
    • selectmode:设置列表框的选择模式。共有四个值,SINGLE表示单选,BROWSE也是单选,但该模式可以通过拖动鼠标来单选,而不仅仅只是点击。MULTIPLE表示多选,EXTENDED则表示可以通过拖动鼠标来多选,当然,也可以配合Shift键通过点击来多选。selectmode属性默认值是BROWSE
    • Listbox:
      • yscrollcommand 列表框纵向滚动时的回调监听,该属性的值是一个回调函数
      • xscrollcommand 列表框横向滚动时的回调监听。
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

好了。本期内容就到这里了。下期内容就进入参数解析部分了。各位大佬,我们下期见咯~