Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试tkinter应用程序_Python_Testing_Tkinter - Fatal编程技术网

Python 测试tkinter应用程序

Python 测试tkinter应用程序,python,testing,tkinter,Python,Testing,Tkinter,我使用Python3和tkinter编写了一个小应用程序。测试每一个小部件,尽管它们并不多,但让人感到畏缩,因此我想编写两个自动化测试来简化这个过程。我读了一些其他问题,似乎与这个问题有关,但没有一个适合我的需要。现在,我正在以一种非常简单的方式进行测试——我为每个小部件调用命令,并手动单击以查看它是否工作。它确实让事情变得快了一点,但我经常遇到一些问题——例如,即使使用库来模拟键盘点击(即pynput),我也无法自动关闭弹出窗口(如showinfo)。是否有一种使用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会做正确的事吗?