最近,我在用 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 的核心原则,以至于我的测试是徒劳的?