2008-09-17 89 views
5

最近,我一直在用Python開發一個GUI應用程序的同時嘗試使用TDD。我發現驗證我的代碼功能的測試非常令人放心,但遵循TDD的一些推薦做法非常棘手。也就是說,首先寫測試很困難。我發現很難讓我的測試可讀(由於大量使用模擬庫)。測試GUI代碼:我應該使用模擬庫嗎?

我選擇了一個名爲mocker的嘲諷庫。我使用它很多,因爲我測試的很多代碼都會調用(a)依賴系統狀態的應用程序中的其他方法或(b)沒有事件循環等情況下不能存在的ObjC/Cocoa對象等。

不管怎樣,我已經得到了很多的測試,如下所示:

def test_current_window_controller(): 
    def test(config): 
     ac = AppController() 
     m = Mocker() 
     ac.iter_window_controllers = iwc = m.replace(ac.iter_window_controllers) 
     expect(iwc()).result(iter(config)) 
     with m: 
      result = ac.current_window_controller() 
      assert result == (config[0] if config else None) 
    yield test, [] 
    yield test, [0] 
    yield test, [1, 0] 

注意,這實際上是三個測試;全部使用相同的參數化測試功能。下面是正在測試的代碼:

def current_window_controller(self): 
    try: 
     # iter_window_controllers() iterates in z-order starting 
     # with the controller of the top-most window 
     # assumption: the top-most window is the "current" one 
     wc = self.iter_window_controllers().next() 
    except StopIteration: 
     return None 
    return wc 

一個我用嘲笑者注意到的事情是,它更容易第二首寫的應用程序代碼,然後回去寫測試,因爲大多數的我嘲笑了許多方法調用,編寫模擬調用的語法比應用程序代碼更冗長(因此寫得更難)。編寫應用程序代碼更容易,然後將測試代碼模型化。

我發現使用這種測試方法(以及一些學科),我可以輕鬆編寫100%測試覆蓋率的代碼。

我想知道這些測試是否是好的測試?當我終於發現編寫好的測試的祕密時,我會後悔這樣做嗎?

我是否違反了TDD的核心原則,以至於我的測試徒勞無功?

回答

-2

單元測試在重構代碼時非常有用(即完全重寫或移動模塊)。只要你在進行大的改變之前進行單元測試,你就會有信心在你完成時沒有忘記移動或包含某些東西。

7

如果您在編寫代碼並使其通過之後編寫測試,那麼您沒有執行TDD(您也沒有從Test-First或Test-Driven開發中獲得任何好處..請查看SO對TDD權威書籍)

的事情之一,問題我已經與 用嘲弄的是,它更容易 先寫的應用程序代碼和 然後回去寫測試 第二,因爲大多數注意到我是 嘲笑許多方法調用和 s yntax編寫的模擬調用比應用程序代碼更加詳細(因此難以寫入 ) 。這是 更容易編寫應用程序代碼,然後 模擬測試代碼。

當然,它更容易,因爲你只是在用特定類型的筆刷繪製橙色後測試天空是橙色的。 這是加裝測試(用於自我保證)。嘲笑是好的,但你應該知道如何以及何時使用它們 - 正如俗話所說'當你有一把錘子時,一切看起來都像釘子一樣'編寫一整本不可讀的,不太可能的幫助文檔也很容易 - 測試。花費時間瞭解測試的內容是可以用來修復損壞的時間。

而且一點是:

  • 閱讀Mocks aren't stubs - Martin Fowler如果您還沒有。谷歌出了一些記錄良好ModelViewPresenter圖案化的圖形用戶界面(假的/模擬出的UI如果需要的)實例。
  • 研究你的選擇,並明智地選擇。我會用白色的左肩上的光環扮演那個說'不要這樣做'的人。閱讀這個問題關於my reasons - 聖賈斯汀在你的右肩上。我相信他也有話要說:)
-3

請記住,TDD不是一個萬能的。這很難,它應該很難,「提前」寫嘲笑測試特別困難。

所以我會說 - 做什麼適合你。即使它不是「認證的TDD」。我基本上做同樣的事情。

您可能希望爲GUI提供您自己的API,該API位於控制器代碼和GUI庫代碼之間。這可能更容易模擬,或者你甚至可以添加一些測試鉤子。

最後但並非最不重要的是,您的代碼對我來說看起來不太難理解。使用mocks的代碼通常很難理解。幸運的是,Python嘲笑比其他語言更容易和更清晰。

相關問題