资源有限的TDD


13

我在一家大公司工作,但仅用两个人的团队来开发桌面LOB应用程序。我已经研究TDD已有很长时间了,尽管很容易实现其在大型应用程序中的好处,但我很难尝试证明在我们的应用程序规模上开始使用TDD的时间。

我了解它在自动化测试,提高可维护性等方面的优势,但就我们的规模而言,即使为我们所有组件编写基本的单元测试也很容易使开发时间加倍。由于我们已经没有足够的时间来完成最后的任务,所以我不确定该朝哪个方向前进。从那时起,敏捷迭代开发之类的其他实践就完美了,但我对小型团队中TDD的生产率权衡感到有些沮丧。

TDD的优势是否值得在时间表非常紧凑的小型团队上花费额外的开发时间?


LOB代表什么?业务范围?
gnat

Answers:


14

丑陋的事实是,一开始它会使您减速。任何新的过程或做法都需要花费一些时间才能逐步完善。以我的经验,TDD在初始实施方面的投入不如维护,错误修复和扩展那样。我知道对其他人来说,这是即时支出,所以这取决于每个人当前的编码风格。

尽管我是TDD的大力拥护者(我将其带入当前的工作中),但我认为您需要有一点喘息的空间(期限/时间表),以便探索和理解这种做法。

您的团队越小,您越能立即受益于TDD。我已经看到了从6到3的团队规模的支出。


2
+1:与节省开发时间无关,它节省(大量!)调试和维护时间。
哈维尔

4
“如果您认为先进行测试很昂贵,请尝试稍后调试”
Ryan Bigg

@Ryan Bigg:我同意单元测试是调试的强大支持,但是编写良好的代码实际上并不难用传统的调试器进行调试。
Giorgio 2013年

@Giorgio:可以编写尽可能好的代码,当由于缺少该代码周围的基础结构而无法单独测试时,再次执行test / debug / change / test循环仅需更多时间。当您在寻找不知道根本原因的错误并且不知道在100K行编写良好的代码中的哪个位置出现错误时,尤其如此。
布朗

10

您在谈论的额外开发时间可能只是一种幻想

TDD与标准单元测试的不同之处在于,它不仅用于进行测试。

TDD is a new way of developing software。这是我所知道的最好方法之一。

因此,它与项目的大小无关。您将从第一行代码中提取好处

  • 它将迫使您以一种易于维护和重用的方式来构造代码。它驱动软件的设计。
  • 它将使重构变得快速,安全和愉快。
  • 它可以帮助您编写较小的功能块,从而使任务的实现更加容易。
  • 通常可以减少调试任务的频率。

我本来要回答的,但皮埃尔说的很好。从小开始,就必须建立一些东西,并且应该在第一天就开始受益。
Marcie

2
这也可能不是幻想。一种新的做法可能需要一段时间才能逐渐完善。尤其是如果没有其他人在旁边做这件事。我会说它可以任意进行。
Dietbuddha 2011年

@dietbuddha:我同意这一点,我不愿发表一些免责声明,但我想强调的是,如果应用得当,TDD的真正好处。

1
@Pierre-TDD似乎经历了同样的问题(例如,要做的事太多而时间又太少),这是第一步(尤其是我反复的努力),TDD的第一步尤其麻烦。我不需要相信这些好处-但是引导自己,然后我的同事目前不在我身边(您将不得不相信,这并不是我缺乏能力...)-部分是由于时间和部分原因是不知道怎么做。
Murph

1
@Murph:您正在开发UI密集型应用程序吗?在此类应用程序上工作时,我倾向于停止使用它。

8

常见的误解,让我大声疾呼:

TDD中的测试具有功能

EOM。

编辑:让我详细说明:“为所有或我们的组件编写...单元测试”是单元测试,而不是TDD。我经常在单人团队中使用TDD并取得了巨大的成功。回报是非凡的。


1
常见的误解是,TDD会生成项目测试。现实是TDD生成项目规范。
显示名称

3

在TDD上有一本很棒的书,《单元测试的艺术》(官方网站),其中有.net中的示例,并带有Java版本。好的方面是,整章都在考虑诸如“将单元测试集成到组织中”-第8章和“使用遗留代码”-第9章之类的问题。尽管我不是该领域的专家(但:-)) ,根据我的经验,我相信这是一个很好的起点。

单元测试的艺术封面


1

您需要解决以下几个问题:

  1. 发布代码中的错误后,您要花多少时间?如果可以对此进行量化,您可能会发现它等于或什至超过了“额外”时间,您将需要编写测试来帮助防止这些错误的发生。

  2. 显然直接编辑以重构代码或添加新功能的频率多久会破坏一些似乎无关的东西?同样,通过良好的测试覆盖范围可以减少这些问题。

即使您不能在上面标出确切的数字,您也应该能够证明您正在这段时间花时间,因此您最好“花在前面”,并且(希望)最终得到更加稳定的产品。


1

当人们与我谈论开始在团队中采用测试时,我总是首先检查测试将如何运行。团队通常没有连续的构建。如果您的资源有限,那么我建议您设置CI服务器是开始认真尝试测试的先决条件。

完成设置后,就可以开始练习TDD。请记住,如果开发该系统时没有考虑到测试,那么您可能很难使现有代码可测试,并且对其进行重组将非常昂贵。

首先寻找容易开始使用TDD的地方-新的类或模块,几乎没有依赖关系。实用程序类和数据结构通常是很好的开始。

感受一下它如何改变您对代码的看法,注意所生成的代码有多好,以及您对该代码有多自信。

我知道我还没有真正回答这个问题,但是我想我的意思是,您应该能够在不花费大量额外费用的情况下完成所有这些工作。通过阅读第一个示例,您将更好地了解项目的优势。

底线-开发速度较慢,但​​缺陷很少,因此修复错误的时间更少。


1
一个附加功能:首先,寻找最高价值的测试。让您早知道的测试已经破坏了代码库。这些往往是高水平的全面测试,这些测试不会告诉您您所破坏的是什么,但是您却破坏了它。通过测试环境,您将很快看到CI的价值。使用测试来调试破损。有了一个适当的系统,添加新测试的成本就会变得越来越便宜/便宜,您可以集中精力进行更多的测试,以更好地证明它可以工作并显示不起作用。
Jim Rush

0

在这里,我认为行为驱动开发会立即获得收益,但是我不确定测试驱动开发是否会取得收益。

在行为驱动的开发中,您以不同的方式处理问题:与业务人员坐下并与他们一起定义该功能块应具有的行为。我在博客的一个条目中对此进行了描述(帖子标题:Writing Behaviors)。

与业务人员或任何人坐下来,将帮助您和他们更好地了解系统需要做什么,以使每个人都满意该功能。它需要做什么才能被您已有的质量检查流程所接受。

定义测试标准,然后将这些测试标准写入自动测试套件中,应减少来回的次数:有人声称该功能已损坏,因为您错过了某些东西(要么是因为您合理地错过了一些东西,要么是因为他们从未告诉过您)关于此事)。

这也可能有助于其他人对您的团队的看法:如果您坐下来确定系统中需要完成的工作,则可以从“笨拙的白痴,这些白痴对一切进行过度的设计,并花时间在我们不要求的事情上”, “具有实用功能的聪明人”。

TL; DR:行为驱动开发可能会很快显示出改进,因为它以“客户”为重点。对我来说,“测试驱动开发”似乎是关于测试“没人”关心的代码库内部,并带来不太明显的业务收益。(行为驱动开发面临着立即的变化:工程师突然变得与“客户”或业务分析师有更多的面对面时间,以试图解决这个问题,这应该是一件好事。 ,他们正在召开有关Feature X的会议,这意味着该方面正在取得进展!”)

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.