我不写testing。 我是愚蠢的吗?

我在unit testing和TDD方面做了一些阅读,我从来没有认真考虑过写这么精确的testing。 诚然,我不是在任何荒谬可笑的项目上工作。 如果我build立的都是小应用程序,我是不是愚蠢的不写testing?

编辑 :澄清,当我说“小应用程序”,我的意思是应用程序不会去控制一个人的生活和/或他们的财物。 我通常build立的东西应该让人们更容易生活,并使其更有效率。

尝试一下,找出答案。 现在有多less时间用你的小应用程序进行debugging? 有多lessbug发布给用户? 你的devise有多好? 你满意吗? 其他开发人员可以使用它,了解它吗?

尝试TDD,看看它是如何工作的。 如果它能帮助你想出更快乐的答案,那就坚持下去。

你不是愚蠢的没有做TDD – 但是如果你不尝试,你可能会有点头脑发热。

我知道TDD在过去几年里受到了很多炒作,我理解你可能对周围的软件项目产生怀疑。 我可以从经验告诉你,但是,TDD不只是炒作。 在unit testing之前,我开发了许多我认为是“坚如磐石”的软件(没有错误,很好的性能等)。 我听说过unit testing,并决定在“小项目”上尝试一下,特别是因为不会花时间去实施。

令我惊奇的是,我很快意识到了testing的优点。 我曾经以为100%完美的function会输出奇怪的结果。 更改一个组件可能会使其他unit testing失败。 这很有趣,因为我意识到我的代码只在input我(作为开发人员)期望用户input的内容时才起作用,而不是在应用程序的生产版本中实际执行的内容。

这个惊喜使我得出了关于TDD的一些结论(除了典型的好处之外):

  • TDD允许您在应用程序的任何阶段testing每个组件(您可以为每个testing设置环境)。 这使您可以确保在整个应用程序中组件的function保持一致。
  • TDD通常鼓励良好的devise。 如果没有对系统进行“组件化”,通常不能testing应用程序的各个单元。 将应用程序分解成可testing的部分(尤其是当您使用控制模式的反转)会迫使开发人员编写更好的代码。
  • TDD增强了开发者和最终用户对系统的信心。 你相信一个无法testing的系统吗? 还是经过彻底testing的?

TDD还有其他许多好处。 还有一些缺点(实施时间不当,实施不当)。 我所能说的是,练习TDD通常会帮助你提高你的开发技能。

最后,我知道你提到你的项目往往很小,所以我的问题是为什么不testing? 这不会花太长的时间来执行。 如果您使用.NET和Java进行开发,则主要的IDE具有简化testingstream程的function。 我也愿意打赌其他语言​​在他们的IDE中有相似的function。

从程序员的观点来看,testing的巨大优势不在于certificate你的应用程序能够工作(事实上,unit testing并不是真的这样做),而是让你对应用程序做出重大改变。 通过testing,您可以更改任何/所有内容,并确定代码在更改之前和之后执行相同的操作。

根据我的经验,testing是文档。 如果你不得不解释一下如何工作,你可以指出开发者在testing中。 评论通常不像testing那么有价值。

我个人的观点是,你没有写testing就牺牲了质量和长期的效率。 我不确定这是愚蠢的资格。 通过不为代码编写testing,您必须依靠其他方法来确保正确的操作,并且在进行更改时不会破坏您的工作代码。 我能想到的补偿不写testing的唯一方法是非常聪明(和敏锐),以便您从不犯错误(或在错误发生之前捕捉它们)或在debugging器中手动testing所有内容。 我对前者不够聪明,对后者没有足够的时间,所以我写testing。

这不是愚蠢或聪明,而是确保质量和可维护的代码。 如果你不想这样做,那么不要写testing。

我为所有事情编写testing,因为99%的应用程序将要更改,并且testing确保应用程序在进行更改时不会中断。

你做什么testing? 当你做出改变时,你多久重新testing一次? testing人员是否会减lesstesting的数量?

对我来说,写出可重复的testing要比手工一次又一次更有趣。

总的来说,对我来说显而易见的重要的事情莫过于一个经常足够的testing,以便发现错误。

对我来说意想不到的是,当我开始写明确的unit testing时,我认为我的代码变得更好了。 只要考虑需要什么样的testing,我就会更仔细地考虑一下这种情况。

最大的窍门是决定在哪里集中testing工作。 UI的? 我手工testing这些。 粗糙的计算引擎 – 写大量的testing用例。

如果没有人会再次触摸代码,则不需要为其编写testing,因为testing的好处之一就是可维护性(是吗?= P)。

如果你所做的一切都很简单,那么你甚至不需要关心TDD或最佳实践。 但是,如果你想学习更好的开发技术,也许你应该考虑改变你的工作。

在这种工作中,你的老板不会接受你花这么长时间写testing和编码。

testing是确保质量和可维护代码的一种方法 。 然而,写得不好的testing对任何人都没有帮助,而且经常会提供一种错误的安全感,使得错误难以确定。

编辑:

高质量,可维护的代码以良好的devise开始 – 一个项目应该考虑写代码之前会出现什么问题,然后写出来。 我不是说testing不好,我只是说,你不能一直说,因为这是'正确' ,然后认为你已经想通了。 就像任何其他“规则”一样,只有你明白为什么你做得足够好,才能做到这一点才有意义。

正如我在另一次讨论中提到的那样,我是TDD的倡导者,直到我真的在真实生活中尝试过它 – 而不是现在。

但是,我发现自动化testing非常有用,尤其是, 验收testing,集成testing和回归testing。 只是不要认为开发过程应该围绕testing。 另外,我没有从unit testing中看到很多好处 – 也许是因为我主要使用静态types语言。

我至less会试一试。 我决定尝试一个侧面项目。 在几天之内,我已经保存了我的隐藏几次,我的代码更改导致我的unit testing捕获“副作用”。

我意识到我实际上花费的时间更less,通过运行和手动testing来debugging和“testing”我的代码。 现在在这个项目上,我可以更改代码并运行unit testing,知道这是好的,而不是运行应用程序,并input我的值集,以便每次进行更改时都可视化地testing所有内容。

聪明的人总是做愚蠢的事情。 你不必使用全面的TDD,但是如果每个人都认为最好的做法肯定是愚蠢的行为,那么就不用写自动化testing。

就我个人而言,我认为不写testing的唯一理由是质量问题远不及获得快速的结果(不pipe多less),或者代码不会太长。 扔掉的脚本,探索性的原型,明天将由一个不耐烦的,但容错的客户设置的最后期限的新function。 那种事。

对于其他的一切,自动化testing意味着你将提供更高的质量和更less的整体工作。

我的经验:

  • 写了一个75000行,关键任务的应用程序。
  • 从我们把这个项目推到现场生产的那一天起,它的确做到了可靠性。

免责声明:自从我还是一个孩子以来,我一直在编程,所以我擅长于工作 – 但即使我对一些简单的testing规则带来的巨大影响感到惊讶,也使得应用程序像奔驰一样运行得如此可靠。

testing的forms为我工作:

  • 我没有做一些从业人员推荐的“先testing,后testing”。 相反,我采取的方法是在写入实际代码之前或之后,将尽可能多的testing集成到项目中。 对于某些方法,首先编写方法,然后再进行testing更容易。 对于其他方法,先写testing然后再写方法比较容易。
  • 我没有使用任何unit testing框架,而是将testing集成到程序的结构中,如其余部分所述。 我使用的唯一框架是任何生成的警告和错误的第三方日志logging框架。 我不会列出我使用的商业版本,保持这篇文章是中立的,任何免费的或商业的日志框架都可以。 我推荐任何允许你查看日志的日志框架,然后按照一些标准进行过滤,因为这在查看大日志中查看任何可疑活动时非常有用。
  • 使用的类级别testing :每个类都有一个方法来testing类中的所有其他方法。 有些方法有一个“姐妹”的方法,负责对上述方法进行testing。
  • 使用过的应用程序级别testing :写了大量的unit testing来将真实生活数据插入到程序中,然后检查返回的数据是否与预期的一样(通常这是一个简单的边界检查)。
  • 使用逐行级别testing :每次我知道variables或数组中的值的预期范围,如果数据超出该范围,我将logging一个无提示警告。 换句话说,我将unit testing集成到代码的结构中。 这些testing可以在Release模式下closures,但是我发现它不会影响最终应用程序的速度,所以我就把它们放在了上面。

在我join的所有testing中,我发现逐行级别的testing对整个应用程序的可靠性有最积极的影响。 令人惊奇的是,如果一个简单的规则,比如“如果variables的内容不是你期望的那么logging一个无声的警告信息”,就会对整个应用程序的可靠性产生如此深远的影响。

这种方法的好处在于它缩短了开发周期。 当然,早期有很多错误和警告logging,但一旦这些错误和警告被修复,最终的结果是非常可靠的。 这种方法使得程序在更改和重构上更加强大。 我忘记了我改变了一些我认为是微不足道的事情的次数,这引发了一个警告,这使我可以修复一个可能已经投入生产的错误。 花费数月寻找难以追踪的错误的通常后期制作阶段实际上已被消除。 这是非常重要的,因为这是一个任务重要的应用程序,如果出了问题,它将面临很大的风险。

我使用的testingforms不是一个银弹,但它会让你的生活(和你的老板的生活)更容易。

底线是我唯一不会使用testing的时候,就是我是某种为我最大的敌人工作的受虐狂,而且我想让我们的生活变得糟糕透顶。

Kent Beck在他上一篇博文中提出了类似的问题,但他表示,他只拒绝testing,因为他不知道这个软件是否会成为一个长期的软件(可维护性等),而且testing很难写。

看完你的编辑,我会说你的目标是让人们的生活更轻松,这需要知道他们的需求,并与他们见面。 这些发展,以及他们需要改变你的代码。 在这些更新中,TDD确实闪耀在我看来,但是你必须从这个开始。

这也有助于其他开发人员稍后查看您的代码,并且无法弄清楚他们的更改如何破坏它,或者如果他们试图修复在您离开该地点之前意外中断的事情。

请记住,我的TDD经验是有限的,因为我很难说服任何人开始使用它的项目…但是我所做过的每一个使用TDD的项目都是世界上更容易维护的。

并不是所有的代码都可以进行unit testing,并不适合所有情况。 所以select一些非接口驱动的东西,比如基于财务或者计算的东西。 尝试一下,你可能会喜欢它。

如果您需要“维护”您的代码,TDD和unit testing作为一个整体只会对您有所帮助。 如果您需要添加一个function,或者如果您需要具有相当less的缺陷数量,并且需要修复它们。 如果你永远不会维护代码,那么unit testing只会阻碍生产力。 小型脚本和应用程序可能就是这种情况,手动(验收)testing就是所有需要的。

在考虑接受任何政策之前,请始终考虑它为业务增添了什么价值。 这就是说,我发现在编程领域里,unit testing是一个障碍,而不是一个好处,这是极为罕见的情况。

我不打算重复这里列出的TDD的所有优点以及其他许多资源。 然而,我可以自己说,一旦你习惯了语言testing框架, 编写testing所需的时间与手动testing代码大致相同 。 因此,我宁愿做一个testing,将停留在那里,并总是检查代码的正确性,而不是每次有变化时手动testing,即使它“永不改变”。

有时候我会看到一些主要方法的人员,通过打印结果并查看他们手动testing他们的代码。 伙计,只是做一个testing – 这是相同数量的代码。 🙂

此外,TDD使您可以编写更多的模块化testing和IOC友好的软件,这不仅有益于可testing性,还有益于您的应用程序的可configuration性和灵活性

项目越大,编写testing就越重要。 如果只是你,在一个小项目上工作,编写testing通常是一个好主意。 如果是你和一个从事大中型项目的团队,如果你想提供高质量,可维护的代码,那么编写彻底,有意义的testing是必要的。

虽然TDD的主要优点之一就是通过validation代码的完整性来确保代码的完整性,但并不是唯一的好处。 TDD的另一个主要优点是,如果正确的做法是隔离一部分function并针对它进行开发。 当你在你的代码之前编写你的testing时,你迫使自己根据预期的结果考虑你的方法应该做什么。

当你从头开始采用这种方法时,你为自己的基础编写testing,随着你进一步进入应用程序,你会看到可以折射和改进代码的点。 当您应用这些更改时,testing本身扮演至关重要的angular色,并通知您是否影响应用程序中的其他任何内容。

使用testing来devise软件需要思维过程的重大转变。 即使是现在,当我没有做testing优先的开发时,我也很难返回和编写testing。 这是一个乏味的工作,我宁愿不这样做。 但是,当我先写它们的时候,它就成了devise的一个关键过程。 我发现在进入一个正在进行的项目时,要做的事情要困难得多。

编辑:当你正在写一种方法,只是为了有一个“啊哈”的时刻,注意到这个泡沫变成绿色,或者当你作出一个小小的改变,你不认为会对你的应用程序的其余部分有任何影响,只会看到红灯熄灭。