单元测试是否值得努力?

我正在努力将单元测试整合到我工作的团队的开发过程中,并且有一些怀疑者。 有什么好的方法来说服团队中怀疑开发者团队测试的价值? 在我的具体情况下,我们将添加单元测试,因为我们添加功能或修复错误。 不幸的是,我们的代码库不适合简单的测试。


我们办公室的每一天都有一种交流,就像这样:

“男人,我只是喜欢单元测试,我只是能够对某些工作方式进行一系列更改,然后通过再次运行测试来证实我没有破坏任何东西......”

细节每天都在变化,但情绪不变。 单元测试和测试驱动开发(TDD)有很多隐藏的和个人的好处,以及明显的隐藏的和个人的好处,除非他们自己做,否则你无法真正向人解释。

但是,忽略这一点,这是我的尝试!

  • 单元测试允许您快速对代码进行重大更改。 你知道它现在可以工作,因为你已经运行了测试,当你做出需要做的改变时,你需要重新开始测试。 这节省了数小时。

  • TDD可帮助您了解何时停止编码。 你的测试让你相信自己现在已经做得足够了,并且可以停止调整并继续下一步。

  • 测试和代码一起工作以实现更好的代码。 你的代码可能是坏/马车。 你的测试可能是坏/越野车。 在TDD你指望这两个是坏/越野车为低的机会。 通常这是需要修复的测试,但这仍然是一个很好的结果。

  • TDD有助于编码便秘。 当面临大量艰巨的工作时,写测试会让你迅速行动。

  • 单元测试可以帮助你真正理解你正在使用的代码的设计。 您不是通过编写代码来完成某些工作,而是首先概述您对代码进行处理的所有条件以及您期望得到的结果。

  • 单元测试给你即时的视觉反馈,当我们完成时,我们都喜欢所有那些绿灯的感觉。 这非常令人满意。 在中断之后离开的地方也很容易,因为你可以看到你需要的位置 - 下一个需要修复的红灯。

  • 与流行的观点相反,单元测试并不意味着编写两倍的代码,或者编码速度较慢。 一旦掌握了它,它就比没有测试的编码更快更强大。 测试代码本身通常相对较小,并且不会给您所做的工作增加很大的开销。 这是你只会相信,当你这样做的人:)

  • 我认为这是福勒说的:“不完美的测试,频繁运行,比完全没有写过的完美测试要好得多”。 我认为这是允许我编写测试的地方,即使我的代码覆盖范围的其余部分是严重不完整的,我认为它们将是最有用的。

  • 良好的单元测试可以帮助记录和定义应该做什么

  • 单元测试有助于代码重用。 将您的代码测试迁移到您的新项目。 调整代码直到测试再次运行。

  • 我参与的很多工作都没有很好地进行单元测试(Web应用程序用户交互等),但即使如此,我们都在这家商店受到了测试感染,并且当我们的测试受到限制时感到最高兴。 我不能很好地推荐这种方法。


    单元测试很像去健身房。 你知道这对你有好处,所有的论点都有道理,所以你开始锻炼。 最初的冲击很大,但几天之后,你开始怀疑是否值得这样做。 你需要花一个小时去改变你的衣服,然后在仓鼠轮子上跑步,而且你不确定除了疼痛的腿和手臂之外,你真的获得了什么。

    然后,在一两周后,就像疼痛消失一样,大截止日期即将开始。 你需要花费每一个清醒的时间去完成“有用”的工作,所以你会去掉无关的东西,比如去健身房。 你失去了这种习惯,到大死期结束时,你又回到原点了。 如果你设法让它回到健身房,你会感觉和你第一次去的时候一样痛苦。

    你做一些阅读,看看你是否做错了什么。 你开始觉得有点不合理,尽管对所有合适的人来说都是不合理的,尽管人们都喜欢锻炼锻炼的美德。 你意识到你没有很多共同点。 他们不必开车15分钟就可以去健身房; 他们的建筑物中有一个。 他们不必与任何人讨论锻炼的好处; 这只是每个人都做的事情,并且被认为是重要的。 当一个大截止日期接近时,他们不会被告知,锻炼是不必要的,比你的老板要求你停止进食更有必要。

    所以,要回答你的问题,单元测试通常是值得的,但所需的努力量对于每个人来说都不会相同。 如果您正在处理一家实际上并不重视代码质量的公司的意大利面条代码库,那么单元测试可能需要付出巨大的努力。 (许多经理人都会为单元测试的赞誉而歌唱,但这并不意味着他们在重要时会坚持下去。)

    如果您试图将单元测试引入您的工作中,并且没有看到您所期望的所有阳光和彩虹,请不要责怪自己。 您可能需要找到一份新工作才能真正让单元测试为您工作。


    最好的方式说服...找到一个错误,编写一个单元测试,修复错误。

    这个特殊的bug不太可能再次出现,你可以用你的测试来证明它。

    如果你足够的话,其他人会很快赶上。

    链接地址: http://www.djcxy.com/p/8965.html

    上一篇: Is Unit Testing worth the effort?

    下一篇: Unit Testing C Code