2017-02-17 163 views
0

我正在嘗試爲我寫的Tkinter應用程序實現unittests(同時瞭解它們)。爲此目的,我已成功地創建一個圍繞我的應用程序的基本結構非常簡約的單元測試,如下圖所示(傳遞一個Tkinter的實例爲master):單元測試tkinter應用程序

classTest.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() 

test.py

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

class testTest(unittest.TestCase): 
    def test(self): 
     a = classTest.App(Tk()) 
     self.assertEqual(a.printy(),"test") 

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

該測試返回它運行成功,雖然它打印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() 

因此,問題是,如果我要在單元測試不同的實例化,修改應用程序有一個虛擬根好象叫這個方式或其他東西完全。

+0

我們可以看到編譯器錯誤? –

+0

我不認爲它增加了很多信息,但我現在添加了它。 –

回答

0

我在應用程序中發現了我想測試的問題,我在主要版本中聲明瞭root = Tk()。這root作爲master傳遞到App類,但在程序中,我撥打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結束後,我身體關閉應用程序:

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

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

if __name__ == "__main__": 
    # Set up Tk(), instantiate the application and close it right away. 
    root = Tk() 
    a = MassyTools.App(root) 
    atexit.register(root.mainloop) 
    root.destroy() 

    # Start the actual tests 
    unittest.main(verbosity=2)