过度使用某种测试方法

43 阅读4分钟

我们都有自动化测试将我们从灾难中拯救出来的故事,但我想告诉你一个故事,当我过度使用某种测试方法时,它对我来说真的很糟糕...。

这是几年前的事了。我当时正在做angular-formly,我刚刚发现React的PropTypes功能。我觉得这是自切片面包以来最酷的事情。笑了,我只是查了一下,在React repo上的第一个问题是问我们是否可以添加一个objectWith PropType验证器。我写了整个东西,包括测试,并把它放在问题中。Sophie Alpert回应说。

这不就是React.PropTypes.shape的作用吗?

哈!哈!哎呀!"。不管怎么说,我决定对人们在配置表单时传递给angular-formly的配置对象进行仅用于开发的运行时验证,这真的很酷。

在React repo上的第二个问题是询问React团队是否愿意将prop类型提取到它自己的包中(这实际上现在已经发生了!查看prop-types)。这并不奏效,所以我决定编写我自己的包,于是api-check诞生了!

像这样的库的一个很酷的地方是,整个库是一堆纯函数!而我们都知道,纯函数是很好的工具。而我们都知道,纯函数超级容易测试,对吗?另外,因为我对我想实现的东西有一个非常清晰的印象(以道具类型为灵感),我认为测试驱动的开发将是一个同步的。

所以我就开始工作了。我开始写了一堆测试,并边写边实现api-check。说实话,这很令人振奋。(我想说的是令人陶醉,但我一生中从未真正喝过一滴酒,所以我不知道😅)。我在写这个的时候很开心。

但是随着时间的推移,我开始注意到一些事情......。当我添加这些行为的时候,它变得越来越不有趣,而且越来越难实现。库的代码开始变得非常复杂。现在我想起来都不寒而栗。你不可能再说服我去写那些代码了。

那么,什么地方出错了呢?我以为TDD是一个过程,通过这个过程你可以创造出漂亮的、有意设计的软件。但留给我的却是一个我不想碰的烂摊子。我一定是做错了什么...

我确实做了。TDD是一个三步走的过程。它经常被称为 "红色、绿色、重构循环"

TDD Cycle

以下是它的工作方式。

  • 🚨红色。在你要创建的函数/模块存在/支持你要添加的功能之前,为它写一个测试。这给你一个失败的测试(你得到一个 "红色 "错误信息)。
  • 绿色。实现足够的代码,使测试通过(你得到一个 "绿色 "的成功信息)。
  • 🌀重构。看一下你写的代码,并重构它,以确保它写得很好,尽可能容易阅读/理解,并且设计得很好。 这一步很酷,因为你现在有一个测试,它会告诉你,如果你在重构的时候破坏了什么)。
  • 🔁重复:这毕竟是一个循环 😉继续下去,直到你完成了你需要的所有实现。

那么,我在api-check上哪里做错了?我跳过了重构的步骤,我从把红色测试变成绿色测试的 "兴奋"(另一个我不知道的东西)中感到非常兴奋,所以我继续下一个功能,没有停下来考虑我正在构建的东西是否可维护。结果发现不是这样的。我正在构建一个难以理解的代码的怪胎。这些代码在离开我的手指的那一刻就已经被遗弃了。

总结

那么,我们从这里面学到了什么?测试驱动开发是非常棒的,在某些情况下它确实可以帮助你开发出伟大的代码。但是如果你跳过了重构的步骤,并且对你正在构建的东西不加注意,就会导致灾难。

朋友们,在那里要小心。和我一起在TestingJavaScript.com学习如何正确地使用TDD 🏆。