通常,我只是使用复制和粘贴以及所有其他不良做法将单元测试放在一起。单元测试通常看起来很难看,充满了“代码味道”,但这真的重要吗?只要“真实”代码是“良好”,我总是告诉自己,这很重要。另外,单元测试通常需要诸如存根函数之类的各种“臭味”。
我应该如何应对设计不佳(“臭”)的单元测试?
通常,我只是使用复制和粘贴以及所有其他不良做法将单元测试放在一起。单元测试通常看起来很难看,充满了“代码味道”,但这真的重要吗?只要“真实”代码是“良好”,我总是告诉自己,这很重要。另外,单元测试通常需要诸如存根函数之类的各种“臭味”。
我应该如何应对设计不佳(“臭”)的单元测试?
Answers:
单元测试的气味重要吗?当然是。但是,它们与代码气味不同,因为单元测试具有不同的用途,并且具有不同的张力来通知其设计。代码中的许多异味不适用于测试。考虑到我的TDD心态,我实际上会认为单元测试的气味比代码的气味更重要,因为代码正好可以满足测试的需要。
以下是一些常见的单元测试气味:
气味的重要性在于它们是设计或其他更基本问题的有用指示,即“有烟就有火”。不仅要寻找测试气味,还要寻找其潜在原因。
另一方面,这里是一些单元测试的好习惯:
我几天前刚读完《单元测试的艺术》。作者提倡在单元测试中和在生产代码中一样注意。
我亲身经历了写得不好,无法维护的测试。我自己写了一些。几乎可以保证,如果测试使维护困难,那么它将不会得到维护。一旦测试与被测代码不同步,它们就成了谎言和欺骗的巢穴。单元测试的全部目的是让人们相信我们没有破坏任何东西(也就是说,它们可以建立信任)。如果测试不能被信任,那将比没用更糟糕。
只要您的单元测试实际上在“大多数”情况下测试您的代码。(大多数时候是故意说的,因为有时很难找到所有可能的结果)。我认为“臭味”代码是您的个人喜好。我总是以一种可以在几秒钟内阅读并理解它的方式编写代码,而不是深入研究垃圾并试图理解什么。尤其是经过大量时间后重新使用它时。
底线-它的测试应该很容易。您不想将自己与“臭味”代码混淆。
绝对是 有人说“任何测试总比没有测试好”。我非常不同意-写得不好的测试会拖延您的开发时间,最终您会浪费大量的时间来修复“损坏的”测试,因为它们一开始就不是好的单元测试。目前对我来说,我要重点关注的两件事是使我的测试有价值而不是负担:
您应该测试结果(发生了什么),而不是方法(如何发生)。测试的设置应与实现尽可能地分离:仅设置绝对必要的服务调用等结果。
可以在测试中允许更多重复,如果这样可以使它们更具可读性,通常您不会在生产代码中允许这样做。只需将其与上述可维护性平衡即可。要明确测试的内容!
总之,您应该非常关注“臭味”测试-它们最终只会浪费您的时间,没有价值。
您已经说过:
单元测试通常需要诸如存根函数之类的各种“臭名昭著”。
听起来您肯定可以阅读一些单元测试技术,例如使用Mocking框架,从而使您的生活变得轻松得多。我会非常强烈地推荐“单元测试的艺术”,它涵盖了以上内容以及更多内容。在长时间编写不佳,无法维护的“臭”测试之后,我发现它很有启发性。这是我今年做出的最佳投资时间之一!
当垃圾开始闻起来时,是时候将其取出。您的测试代码应与生产代码一样干净。你可以给妈妈看看吗?
我几乎没有提交我的答案,因为花了我一段时间才弄清楚如何甚至将此作为一个合法问题来解决。
程序员从事“最佳实践”的原因不是出于美学原因,也不是因为他们想要“完美”的代码。这是因为它节省了他们的时间。
因此,您要问的问题(从我的角度来看)是我应该节省时间还是编写会浪费时间的代码?
对于这个问题,我只能说,您的时间有多重要?
仅供参考:存根,嘲笑和猴子补丁都具有合法用途。他们仅在不适当使用时“闻”。