我知道Dan North在设计BDD时的一个意图是将词汇从测试领域的复杂性中抽离出来。然而,在实施外部驱动模式时,似乎我们仍需要一些对模拟行为(或者如果您愿意,存根行为)的理解。North在这个视频中建议,如果我从最外层的领域对象开始并向内部工作,我会在发现协作者时模拟协作者,然后稍后用正确的实现替换它们。因此,最终我会得到一组端到端测试。
Martin Fowler在这篇博客文章中似乎看到了不同的东西,他将TDD分为两派:“传统TDD”尽可能使用真实对象,在必要时使用模拟;而“模拟TDD”则更喜欢在大多数情况下使用模拟。他认为BDD倾向于后者。也就是说,在开发功能的最后,采用“模拟派”方法将保留实际测试中的模拟内容(很抱歉在BDD讨论中使用这个词)。
公平地说,两个资料都已经过时了,也许随着BDD在单元级别和验收级别之间的应用逐渐明晰,情况会变得更清楚。
但我的问题是:当我的需求完成时,我的场景实际上应该有多少端到端测试? North解释说,BDD需要抽象。例如,当我测试登录行为时,我的场景将详细说明登录过程的含义。然而,在进行其他需要但不涉及登录的场景时,我不想一遍又一遍地执行这些步骤。我希望有一个简单的抽象,仅仅说“假设我已经登录”,这样我就可以执行其他行为。
看起来我的抽象方法将是模拟某些协作者(或提供“测试替身”),而有些情况可能会比其他情况更多地使用它们。例如,我是否总是要模拟外部资源,如数据库或邮件服务器?
也许我问错了问题。BDD关注的是沟通、缩短反馈周期以及发现你不知道的东西。也许选择模拟什么和不模拟什么是无关紧要的问题,只要我们感兴趣的行为实际上是有效的。我很想知道别人在这方面的做法。