在开始一个新项目时,我应该使用TDD吗?

3
我正在开发一个新的PHP项目,虽然我喜欢测试驱动开发(TTD),但在项目的这个阶段它似乎更加妨碍而不是有帮助。我开始编写单元测试,但现在,我深入到应用程序功能的原型设计中,发现自己不仅要编写测试,还要重写核心框架的一些部分。这似乎让我花费了更多时间来重写测试,也许我应该等到项目处于alpha/beta阶段再去写。在项目的初期阶段,即使有很大的可能性需要重新编写它们,我是否应该从一开始就编写单元测试呢?
5个回答

3

如果你要使用TDD,最好从一开始就使用它。

如果你相信这是正确的选择,那么就使用它,否则在将来决定使用它时可能会遇到麻烦。


同意。TDD很棒,虽然它可能会让事情变得困难,但如果你决定在中途转向使用TDD,情况会更糟。 - eandersson

3
是的,这是了解您的系统并创建可靠API的最佳方式。
听起来你需要将测试提升到更高的级别。不要测试单个方法,而是测试功能单元。最近的热门词汇是BDD或上下文/规范,但实际上这并不是一件不同的事情,因为我还没有遇到过一个不至少试图朝着这个方向发展的TDD从业者。

2
我对你的说法有异议。TDD确实是设计系统的一种方式,但要真正掌握设计,它并不能替代进行适当的需求分析,并在编写任何代码、测试用例或其他内容之前充分理解问题域。即使考虑到这一点,我也会认为“建立一个用于丢弃”的做法更有可能启发人。 - Tyler Eaves
@TylerEaves 正确。依据我的经验,测试驱动开发(TDD)是进行适当分析和了解开发人员掌握的领域的最佳方式。所以,是的,它是一种工具,我认为它是一种非常强大的工具,但它不是你应该使用的唯一工具。 - George Mauer
1
唯一真正完成的需求分析是从交付的软件中进行的。:( - Tony Hopkinson
@Tyler Eaves +1,赞同“建立一个用于丢弃的代码”。程序员可以比编写传统规范更快地编写代码。让这个可丢弃的代码成为某种规范。 - pilotcam
@pilotcam 当有目的地完成时,它是很棒的,但天哪,那是一个雷区。我曾经参与过一些项目,在那里,由于政治原因,POC成为了第一个版本。该项目从未恢复。我也曾经被交付了一个糟糕的、由一个刚学会编程的人编写的应用程序版本,并被告知将其用作规范。这两种情况都很难结束,而且并不罕见。 - George Mauer

1

当然,你肯定会重写它们,因为事情总是在变化。

如果你进行了完整彻底的需求分析,事情也会发生变化(更有可能是在你追逐那个幻想的时候已经发生了变化),你将不得不重新分析。

但是,如果你直接开始编写代码并完成一些可交付成果,你将没有任何有用的分析和测试,而整个销售部门都会摩拳擦掌,因为交付=可销售。

迭代,编写你能够编写的测试,实现它们,看看下一步该怎么做。无论是TDD还是传统的瀑布模型,在你拥有一些软件之前,都需要大量的前期工作。

把前期工作放在第二位,没有多少用处,也永远不会发生。

也许你需要更多的概念验证或故事板,或者更好的分析,但是所有的跳进去只会在仪表盘上放置虚假的笑脸,你唯一能得到的赞誉就是当车轮脱落时被踢在要害部位,以及次贷款式的技术债务危机。


1
我发现在项目的这个阶段,它似乎更加妨碍而不是有帮助。为什么会这样?你能更客观地说明你的担忧吗?
现在我深入进行一些应用特性的原型设计时,我发现自己除了编写测试之外,还得重写核心框架的某些部分。感觉我正在花费更多的时间重写测试代码,或许我应该等到项目处于更多的alpha/beta阶段再开始测试。
  • 在原型设计时不要使用TDD。原型是为了快速获取知识,最好在时间框架内完成。一旦你消除了不确定性,就可以丢弃原型。这次开始使用TDD。
  • 你的测试是否因为你现在有更好的见解而改变?还是说测试与实现耦合(知道测试主题如何实现与提供的服务)?前者是不可避免的,除非你有卓越的远见……需求变化,测试也会变化。后者是一种气味……可以通过关注“什么”而不是“如何”来避免。
  • 等到你的产品/应用程序稳定下来的问题是……你可能会一直拖延,或者你可能会得到一个难以测试的设计。这将使编写测试(稍后)比必须的困难。 如果你在可测试的代码基础上进行小的增量工作,TDD会更容易。测试也是一个安全网,它帮助你有信心地进行更改并提供即时反馈。

有一个安全网是很重要的,这是测试的一部分,但人们经常忽略它。人们倾向于将测试视为实现的最终验证,而不是过程的一部分,无论它们是在最开始还是最后完成/从未完成。 - Tony Hopkinson

0
  • 是的,我认为从一开始就开始编写测试非常重要。TDD(测试驱动开发)不仅仅是测试单个类。它应该指导您在设计阶段做出的决策。

  • 当您首先编写测试时,您将更好地了解您的问题。您说您可能会稍后重新编写它们。如果是这种情况,那么这可能意味着您将更好地了解您的系统,这是一件好事。然后,您可以通过实施进一步的测试或重构现有测试来重新设计系统。

  • 虽然可能感觉浪费时间,但实际上并不是,因为您将更好地了解正在处理的系统。

  • 我目前正在阅读的一本书(《Growing Object Orientated Software Guided by Tests》)提到了“Walking Skeleton”概念。它建议您使用TDD开发最小的工作解决方案,即使它非常基础。

  • 另一个重要的观点是,您应该尝试从一开始自动化部署。这不完全是单元测试,而是部署测试,与单元测试同等重要甚至更重要。如果您在项目开始时进行此类测试,则不会在发布日期附近遇到意外问题。您还将更好地了解系统的不同组件如何配合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接