在您阅读的有关BDD(行为驱动开发)的每个网站中,您都可以找到一个非常简单的好例子,向您展示定义需求的显而易见和容易。但是,尝试在大型产品(而不是计算器示例)中实施此过程,向我展示了事情可能变得(或将变得)非常复杂且难以理解。特别是在稍后更改请求意味着为此需要进行大量的工作来更正集成测试。
所以我想知道,BDD真的值得吗?它是否解决了其他技术无法解决的问题!
在您阅读的有关BDD(行为驱动开发)的每个网站中,您都可以找到一个非常简单的好例子,向您展示定义需求的显而易见和容易。但是,尝试在大型产品(而不是计算器示例)中实施此过程,向我展示了事情可能变得(或将变得)非常复杂且难以理解。特别是在稍后更改请求意味着为此需要进行大量的工作来更正集成测试。
所以我想知道,BDD真的值得吗?它是否解决了其他技术无法解决的问题!
Answers:
我认为最好的资源之一BDD是规范用例的书。它介绍了许多有关如何组织BDD测试以及应该如何编写它们的内容,以便在需求变化时不会造成太多的返工。
如果您的测试变得复杂或过于复杂,则可能是您做错了。BDD和TDD相同。编写好的测试很困难,而且要花几个月的时间才能学会。
可能会认识到BDD的重点是对话。BDD实际上是一种分析工具,它恰好可以提供一些回归测试,作为一个很好的副产品。
我已经在各种级别的对话中使用了场景。从确定不同的利益相关者以查看发布是否很可能被接受,到确定模块或类的行为方式。
我可以建议一些提示和技巧来简化此过程。
如果您以前从未做过,它将改变。
对于域或业务而言,任何新事物都可能发生变化。如果您正在讨论这些场景,对其进行质疑,并且业务人员说:“哦,我不确定,” 您可能会意识到自己正处在这个空间中。这是停止尝试执行BDD并添加一些内容以获取更快的反馈,以帮助企业确定所需内容的好兆头。一旦想法稳定下来,就可以回顾场景。
所有项目在某些方面都是新的,否则您就不会这样做。
如果您以前做过,那很无聊。
除了新的,与众不同的方面之外,项目通常还具有一些商品化方面,与已经完成的方面类似。例如,如果我要生产一部新手机,它仍然需要拨打电话。“打个电话”是一个众所周知的场景,我们无需讨论。同样,“登录”甚至“用户注册”之类的东西都很无聊。
尽可能在这些库中使用库,然后就不必围绕它们编写方案。另外,请先进行其他操作-已经有一个已登录的用户,然后计算出他要登录的内容。这些区域不太可能更改,因此无论如何您都可以摆脱手动测试。
如果有人以前做过,那么通过场景进行交谈会有所帮助。
在我们有特定于域的需求,某些人相对理解的东西和真正的不确定性主要围绕范围而不是系统的实际行为之间,存在一些差异。
通过场景进行交谈可以帮助开发团队发现行为,利用专家的知识,并确保捕获已知的有价值的行为。
这是BDD最有效的地方。我的技巧是在功能文件(或Wiki,如果您不进行自动化)的顶部编写最有趣的方案,并删除所有重复或易于推断的方案。
尽可能使用方案作为应用程序工作方式的示例。例如,如果要显示验证的工作原理,请显示几个应用程序如何帮助用户填写表格的示例。使用单元测试来检查验证是否严格,这更容易维护和运行。
进一步阅读
如果您对此感兴趣,这里有一些我写的东西可能会有所帮助。
针对开发人员的Cynefin,将更详细地介绍这三个领域
我的教程幻灯片,对您来说都很好并且带有注释,并且涵盖了整个堆栈。
去年秋天,我们建立了一个相当复杂的(领域复杂性)项目,老实说,将前期工作放到BDD中可以节省项目。我已经看到域复杂性和BDD的好处之间有很强的相关性。
让我摆脱一件事:测试复杂的业务规则很困难。问题是,您是否想在每次更改时都尝试并记住所有疯狂的情况,还是希望该安全网在违反规格时通知您。花费前期时间并计算出所有场景,将它们写下来,最后为它们编写所有测试。
而当您稍后回来尝试弄清事情时,拥有可测试的规范可以节省生命。
BDD是基于TDD(测试驱动开发)的开发过程,以下是根据我的个人经验得出的TDD的一些优缺点:
缺点:
我从事的项目超过90万行代码。我仍然遵循BDD。您需要考虑的一件事是纯粹由于测试用例而可能捕获的可能错误的数量。几年后,您将对BDD发誓!