单元测试tkinter应用程序

2024-06-25 23:34:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我编写的Tkinter应用程序实现单元测试(同时了解它们)。为此,我设法围绕我的应用程序的基本结构创建了一个非常简单的单元测试,如下所示(将Tkinter实例作为master传递给它):

在类测试.py在

#! /usr/bin/env python
from Tkinter import *

class App():
    def __init__(self,master):
        self.text = "foo"
        self.printy()

    def printy(self):
        print self.text
        return "test"

# Call the main app
if __name__ == "__main__":
    root = Tk()
    app = App(root)
    root.mainloop()

在测试.py在

^{pr2}$

这个测试返回它运行成功,尽管它确实打印了foo两次。但是,当我试图在整个应用程序上运行相同的概念时,它会在类的__init__上崩溃。在

在unitTest.py在

#! /usr/bin/env python
import unittest
from Tkinter import *
import MassyTools

class readTest(unittest.TestCase):
    def test(self):
        a = MassyTools.App(Tk())
        self.assertEqual(a.readData("./tests/calibrated_IBD cohort sample H6-run 1_0_E24_1.xy")[0][0],1299.11)

if __name__ == "__main__":
    unittest.main()

运行此测试会因为根未定义而崩溃(请参阅下面的错误)。在

enter image description here

我一直在根据这个blogpost进行嘲弄,但我还没有真正掌握这个概念。下面是MassyTools.py包含有问题的self.toolbar行的文件:

class App():

    def __init__(self, master):
        # The Canvas
        self.canvas = FigureCanvasTkAgg(self.fig, master=master)
        self.toolbar = NavigationToolbar2TkAgg(self.canvas, root)
        self.canvas.get_tk_widget().pack(fill=BOTH, expand=YES)
        self.canvas.draw()

因此,问题是,如果我应该在unittest中以不同的方式实例化它,那么修改应用程序,使其具有一个伪根(如果以这种方式调用的话)或者完全是其他方法。在


Tags: pyimportselfmasterapp应用程序initmain
1条回答
网友
1楼 · 发布于 2024-06-25 23:34:37

我在要测试的应用程序中发现了问题,我在main中声明了root = Tk()。这个root被作为App传递给master类,但在程序中,我调用了root,它应该在master的地方。下面的更改消除了最初的崩溃,我还包括了对atexit的调用,以不必物理地关闭应用程序(根据this答案)。在

修订申请:

class App():

    def __init__(self, master):

        # The Canvas
        self.canvas = FigureCanvasTkAgg(self.fig, master=master)
        self.toolbar = NavigationToolbar2TkAgg(self.canvas, master)
        self.canvas.get_tk_widget().pack(fill=BOTH, expand=YES)
        self.canvas.draw()

# Call the main app
if __name__ == "__main__":
    root = Tk()
    app = App(root)
    root.mainloop()

我调整了我的unittest.py代码如下所示,在我实际关闭应用程序后,现在以OK结束:

^{pr2}$

相关问题 更多 >