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