簡體   English   中英

測試GUI代碼:我應該使用模擬庫嗎?

[英]Testing GUI code: should I use a mocking library?

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

我選擇了一個名為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

我在使用mocker時注意到的一件事是,首先編寫應用程序代碼然后再返回並編寫第二個測試更容易,因為大部分時間我都在模擬許多方法調用和編寫模擬的語法調用比應用程序代碼更冗長(因此更難編寫)。 編寫應用程序代碼然后對其進行建模測試代碼會更容易。

我發現使用這種測試方法(以及一些規則),我可以輕松地編寫具有100%測試覆蓋率的代碼。

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

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

如果您在編寫代碼並通過測試后編寫測試,那么您就不會使用TDD (也沒有獲得測試優先或測試驅動開發的任何好處..查看有關TDD權威書籍的SO問題)

我在使用mocker時注意到的一件事是,首先編寫應用程序代碼然后再返回並編寫第二個測試更容易,因為大部分時間我都在模擬許多方法調用和編寫模擬的語法調用比應用程序代碼更冗長(因此更難編寫)。 編寫應用程序代碼然后對其進行建模測試代碼會更容易。

當然,它更容易,因為你只是通過用特定類型的畫筆繪制它來測試天空是橙色的。 這是改造測試(為了自我保證)。 模擬很好,但你應該知道如何以及何時使用它們 - 就像俗話說的那樣'當你有一把錘子時,一切看起來像釘子'這也很容易寫出一大堆不可讀的,而不是有用的。 - 測試。 花在理解測試內容上的時間是可以用來修復損壞的時間。

重點是:

  • Mocks不是存根 - Martin Fowler如果你還沒有。 谷歌出了一些好的ModelViewPresenter圖形化GUI的記錄實例(如有必要,偽造/模擬UI)。
  • 研究你的選擇並明智地選擇。 我會扮演你左肩上有光環的家伙,說“不要這樣做”。 根據我的理由閱讀這個問題 - 聖賈斯汀就在你的右肩上。 我相信他也有話要說:)

重構代碼時,單元測試非常有用(即完全重寫或移動模塊)。 只要您在進行重大更改之前進行單元測試,您就會有信心在完成任務時忘記移動或包含某些內容。

請記住,TDD不是靈丹妙葯。 這很難,它應該很難,而且“提前”寫出模擬測試特別困難。

所以我會說 - 做對你有用的事情。 即使它不是“經過認證的TDD”。 我基本上做同樣的事情。

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

最后但同樣重要的是,您的代碼看起來並不太難以理解。 使用模擬的代碼通常難以理解。 幸運的是,在Python中,模擬比其他語言更容易和更清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM