Python 测试tkinter应用程序
我使用Python3和tkinter编写了一个小应用程序。测试每一个小部件,尽管它们并不多,但让人感到畏缩,因此我想编写两个自动化测试来简化这个过程。我读了一些其他问题,似乎与这个问题有关,但没有一个适合我的需要。现在,我正在以一种非常简单的方式进行测试——我为每个小部件调用命令,并手动单击以查看它是否工作。它确实让事情变得快了一点,但我经常遇到一些问题——例如,即使使用库来模拟键盘点击(即pynput),我也无法自动关闭弹出窗口(如showinfo)。是否有一种使用tkinter测试应用程序的有效方法 以下是我现在使用的代码:Python 测试tkinter应用程序,python,testing,tkinter,Python,Testing,Tkinter,我使用Python3和tkinter编写了一个小应用程序。测试每一个小部件,尽管它们并不多,但让人感到畏缩,因此我想编写两个自动化测试来简化这个过程。我读了一些其他问题,似乎与这个问题有关,但没有一个适合我的需要。现在,我正在以一种非常简单的方式进行测试——我为每个小部件调用命令,并手动单击以查看它是否工作。它确实让事情变得快了一点,但我经常遇到一些问题——例如,即使使用库来模拟键盘点击(即pynput),我也无法自动关闭弹出窗口(如showinfo)。是否有一种使用tkinter测试应用程序的
import tkinter as tkinter
import unittest
from mygui import MyGUI
class TKinterTestCase(unittest.TestCase):
def setUp(self):
self.root = tkinter.Tk()
def tearDown(self):
if self.root:
self.root.destroy()
def test_enter(self):
v = MyGUI(self.root)
v.info_button.invoke()
v.close_button.invoke()
v.btnOut.invoke()
if __name__ == "__main__":
unittest.main()
我不太了解unittest,但我找到了一个解决方法,可以在测试期间关闭showinfo之类的弹出对话框。其思想是使用键盘事件来调用对话框的按钮。但由于应用程序正在等待用户关闭弹出对话框,因此我们需要在之后使用
提前安排键盘事件:
self.root.after(100, self.root.event_generate('<Return>'))
v.button.invoke()
self.root.after(100,self.root.event_生成(“”))
v、 button.invoke()
完整示例
import tkinter
from tkinter import messagebox
import unittest
class MyGUI(tkinter.Frame):
def __init__(self, master, **kw):
tkinter.Frame.__init__(self, master, **kw)
self.info_button = tkinter.Button(self, command=self.info_cmd, text='Info')
self.info_button.pack()
self.quit_button = tkinter.Button(self, command=self.quit_cmd, text='Quit')
self.quit_button.pack()
def info_cmd(self):
messagebox.showinfo('Info', master=self)
def quit_cmd(self):
confirm = messagebox.askokcancel('Quit?', master=self)
if confirm:
self.destroy()
class TKinterTestCase(unittest.TestCase):
def setUp(self):
self.root = tkinter.Tk()
self.root.bind('<Key>', lambda e: print(self.root, e.keysym))
def tearDown(self):
if self.root:
self.root.destroy()
def test_enter(self):
v = MyGUI(self.root)
v.pack()
self.root.update_idletasks()
# info
v.after(100, lambda: self.root.event_generate('<Return>'))
v.info_button.invoke()
# quit
def cancel():
self.root.event_generate('<Tab>')
self.root.event_generate('<Return>')
v.after(100, cancel)
v.quit_button.invoke()
self.assertTrue(v.winfo_ismapped())
v.after(100, lambda: self.root.event_generate('<Return>'))
v.quit_button.invoke()
with self.assertRaises(tkinter.TclError):
v.winfo_ismapped()
if __name__ == "__main__":
unittest.main()
导入tkinter
从tkinter导入消息框
导入单元测试
类MyGUI(tkinter.Frame):
def _初始功率(自功率、主功率,**kw):
tkinter.Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuu(自、主、**kw)
self.info\u button=tkinter.button(self,command=self.info\u cmd,text='info')
self.info_button.pack()
self.quit\u button=tkinter.button(self,command=self.quit\u cmd,text='quit')
self.quit_按钮.pack()
def info_cmd(自我):
messagebox.showinfo('Info',master=self)
def quit_cmd(自我):
确认=messagebox.askokcancel('Quit',master=self)
如果确认:
自我毁灭
类TKinterTestCase(unittest.TestCase):
def设置(自):
self.root=tkinter.Tk()
self.root.bind(“”,lambda e:print(self.root,e.keysym))
def拆卸(自):
如果self.root:
self.root.destroy()
def测试输入(自身):
v=MyGUI(self.root)
v、 包()
self.root.update_idletasks()
#信息
v、 在(100,lambda:self.root.event_generate(“”))之后
v、 信息按钮。调用()
#退出
def cancel():
self.root.event_generate(“”)
self.root.event_generate(“”)
v、 之后(100,取消)
v、 退出按钮。调用()
self.assertTrue(v.winfo_ismapped())
v、 在(100,lambda:self.root.event_generate(“”))之后
v、 退出按钮。调用()
使用self.assertRaises(tkinter.TclError):
v、 winfo_ismapped()
如果名称=“\uuuuu main\uuuuuuuu”:
unittest.main()
您真的想测试它吗?当你打电话给showinfo时,难道你不相信tkinter会做正确的事吗?