最近,我一直在用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的核心原則,以至於我的測試徒勞無功?