你是对的。BDD不能消除语言歧义性的问题-一点也不。正如其他人指出的那样,翻译后的代码片段需要通过适当定义它们来进行匹配,但这也不能解决潜在的歧义问题。
现在,尽管未解决此问题,但为什么BDD实际上值得?出于某些原因,此列表当然并不完整。
歧义尚未解决
这既不是支持BDD的理由,也不是反对BDD的理由。但是,当您将其与其他方法(例如用户故事或需求)进行对比时,所有软件开发方法都会遭受语言歧义的困扰,因为它们都以自然语言形式以一种或另一种方式开始。
从技术上讲,语言歧义性问题已通过诸如lojban之类的人工语言解决了,但话又说回来,您的客户和开发人员很可能不知道该语言。
无处不在的语言
BDD与无处不在的语言的想法紧密相关。能够与所有客户,测试人员和开发人员一起指定方案,这使BDD优于其他方法。
考虑一位传统的需求工程师写下所有需求。一旦您成为测试人员或客户,便获得了300页的文档,其中包含要审核的所有要求,那么您所面临的问题将比那里使用的术语还要紧。
用户故事在这方面做得更好,因为它们在创建过程中也包括了所有利益相关者。就普遍使用的语言而言,我不会说BDD或用户案例都更好-尽管它们在下一点确实有很大的不同。
可测性
BDD的一个主要方面是您的规范实际上是可执行的(通过Cucumber等)。需求和用户案例都没有提供此功能。对我个人而言,这是BDD的主要卖点。
与传统需求相反,我们已经告诉需求工程师很多年了,他们的需求应该是可测试的。但是,每个项目都会看到这样的情况:测试人员意识到某个地方不知道如何测试特定需求。
如果操作正确,则用户故事可以在早期创建阶段就包括测试人员,以确保这一点。不幸的是,这是一个理论与现实世界发生冲突的案例,在那里我看到了许多测试人员从未见过的故事。
另一方面,BDD会自动为您提供可执行的测试方案。没有任何借口,也没有办法解决(除非您完全忽略自动化层,并写下奇特的诗歌场景)。
一般而言,“测试优先”是在软件开发的所有阶段都非常有价值的原则,而BDD是其在开发的最外层的应用(与单元级别的f.ex. TDD相比)。
摘要
总之,BDD不会使您摆脱自然语言歧义的问题。但是,它确实可以通过两个要点来帮助您解决该问题:专注于一种普遍存在的语言以减少歧义(它不会完全消除歧义,但是会大有帮助!),以及通过迫使您编写可执行文件规格。后一点有助于解决歧义问题,主要是因为这是歧义开始以其他方式出现的问题。