您真的必须以测试优先的方式进行BDD / TDD吗?


11

即使我没有参加过TDD或BDD项目,或者我曾经在其中说他们正在进行TDD,但距离该项目还很遥远,但这些都是我在考虑的事情,实际上我会尽力阅读关于。

回到问题。在执行BDD时,您应该先编写“测试”并使其失败,对吗?然后实现该功能或您所说的功能。但是,如果您将其推向极致,那难道不是某种自上而下的开发吗?您正在查看自己的UI,并说:“我想在此使用此功能/行为”。然后,您可以修复UI以实现该功能以及支持该UI的代码。至此,您尚未实现任何业务逻辑或数据访问逻辑,而只是实现了行为。我要针对的目标不是先编写测试,而是先编写UI代码。在某些情况下,这将导致数据访问和业务层使用相同的代码,因为您使用UI代码来定义业务需要支持的内容。

当然,您应该为此进行补充测试,以确保该功能正常运行。

有什么想法吗?


TDD下的测试是单元测试,它们直接驱动模块,就像通过单独的main。在自上而下的注释中,您正在谈论功能测试,该功能测试通过一个执行整个程序main
Macneil 2010年

@Macneil:我不是在谈论测试整个程序的功能测试,即使您自上而下地实现/设计程序,您仍然应该为所有公共代码实施单元测试。仅仅因为您自上而下进行操作并不意味着您不能将不同的图层抽象化,因此您可以单独隔离所有图层。
托马斯·詹森

1
@Macneil:这是一个普遍的误解。TDD测试不是单元测试。TDD测试功能,它没有固定的比例。
史蒂文·A·劳

2
但是规模是固定的:测试必须在TDD中快速执行。必须进行的测试也超出了TDD的范围。总体而言,TDD是一个开发计划,而不是测试计划。
Macneil

@Macneil:“快速”是一个相对术语。我上一个项目中的测试套件大约在30分钟内执行。它取代了8 小时的手动测试。这足够“迅速”!
Steven A. Lowe

Answers:


8

您是从测试UI的高级角度谈论BDD。在此级别进行测试比在Javascript /服务器端代码中降低测试难度更大。

我在TDD上读过的几本书都说您应该像编写基础系统一样编写代码,并且编写足够的代码以使测试通过。您可以在服务器上编写存根,以使您的UI行为测试通过。然后,您从这个存根缝开始,为服务器端代码编写一些单元测试,然后逐步进行完整的实现。

我经常编写代码,就好像存在基础层以使高级测试通过一样,它的感觉就像是钻进一个兔子洞并提取许多其他类以满足高级测试,然后为这些较低级别编写测试。正如您已经认识到的那样,它可以帮助您从更高级的测试开始集中精力。

任何经验丰富的程序员都知道,软件开发有很多层次。我倾向于工作低于UI,然后考虑UI从服务器开始需要的数据或行为,然后从那里开始(也许是因为这些天我没有做太多UI工作)。

如果我真的很诚实,那么从底层提取类就意味着我不是先进行测试,而是……在几分钟甚至几小时内,我将对该代码进行测试。这对我仍然很有益,因为我可以帮助您了解在哪里需要为类提供依赖关系并遵守单一责任原则-如果难以测试,那么您在一个地方做得太多。


我想你是对的。这个问题是在今年夏天我在Rails上试用ruby时得到的,那里有一些bdd测试来驱动UI,该UI随后会驱动基础类的实现。
Tomas Jansson

17

是! 否则,您将获得开发驱动的测试

但是,实际上,存在使用“纯” TDD很难解决的问题。通过预先编写一些未发现的生产代码,并在以后的测试中进行覆盖(以及以后学习如何解决TDD中的类似问题),可以提高生产效率。请看一下这项技术该技术的作者称其为漂洗重复TDD,因为它没有更好的用语。


3
第一行很棒。
EpsilonVector 2010年

与TDD相比,这是正确的,但是自上而下的处理方式应该与BDD完全吻合,对吗?我查看了GUI并指定了我想要的行为,确保我没有立即编写“行为测试”,但是在实现它之前,我确实通过UI指定了行为。
托马斯·詹森

15

如果您不先编写测试,就不会通过测试来推动开发。嗯,您不是在进行测试驱动的开发!


公平地说,不是在执行BDD(不是TDD)时是否应该首先编写测试的问题?
bytedev 2014年

随意用“行为”代替“测试”。从本质上讲,我还没有任何东西可以说服我,TDD和BDD之间有很多区别。集中精力,也许。但是核心思想?没那么多。
Frank Shearar 2014年

不同意您没有进行测试驱动的开发这一事实。您并不是根据关键字的定义来执行此操作的,但是只要您正在为代码开发测试,那么无论您何时编写代码,这些代码肯定都受测试驱动。
替代

TDD 特别意味着在代码之前编写测试。如果您不喜欢它,可以与发明该术语的肯特·贝克(Kent Beck)接洽。在代码之后编写测试可能会在一定程度上推动代码的发展,但是您仍然可以欺骗自己,使自己相信,如果不是这样,您就会通过测试来推动代码设计。而且编写这些测试更加困难,因为您常常不得不更改未经测试的代码。看到它的次数太多了。
Frank Shearar 2014年

@FrankShearar我承认,按照肯特·贝克所说,它不是TDD,但是坦率地说,我不在乎某个随便的人怎么说。无需先编写测试就可以通过测试来驱动代码设计。
可替代

4

如果您想以这种方式工作,那就去吧。但这不是测试驱动的开发。


3

您所描述的内容听起来很像“ 前端设计”方法。不幸的是,前端设计是Alex Papadimoulis在敏捷方法上的讽刺。


我想知道您是否知道任何反击FAD的文章,揭穿其讽刺性的痕迹?
CL22

3

我个人认为,在设计阶段考虑测试至关重要。拥有一个可行的实现确实很棒,但是唯一可以确保您拥有一个正常工作的产品的方法就是您已经对其进行了逐项测试。解决这个问题的方法是将单元测试与熟练的质量检查团队合作进行结合。

现在,如何将此准则安装到您的团队中就由您决定了。TDD是一种这样的策略-并且有其地位,还有许多其他变化。但是,TDD并不特别适合开发UI布局。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.