[译]我是怎样学习测试我的Rails应用的-Part1:开端

January 20, 2014

最近在学习Rails的开发过程中深感TDD和BDD的好处,开发效率远比没有使用测试的时候高。例如:当项目需求突然有变时,在修改部分代码后,为了确保程序还能如常运行,就不得不再手动测试各个页面。而且正如卷福所说:人总是会犯错的,所以还不能保证每次都测试出所有错误。但使用TDD和BDD后,只要保证有足够多的测试样例来覆盖程序中各个部分,那么每次修改后都只要轻轻一运行测试样例,那么所有bug都将无处遁形。

原作者通过一系列的文章深入浅出地介绍了自己是怎样测试自己的程序的,个人打算将其翻译出来,希望藉此提升自己的能力的同时,能帮助更多的人使用TDD和BDD进行开发。而这是该系列的第一篇(How I learned to test my Rails applications, Part 1: Introduction)。不过本人翻译过的文章不多,如有错误,诚挚希望进行指教:]


Ruby On Rails和自动化测试,两者可谓齐头并进。Rails带有内建的测试框架,但如果这不是你的菜的话还能替换成自己喜欢的。所以,测试对Rails是非常重要的 – 不过有很多Rails开发者可能没有测试他们的项目,或者只是充其量地添加一些简单的模型验证。

可能对于开发Ruby或Web框架的人来说这是一个很新的概念。可能是觉得这会增加额外的工作。或者这会让他感到时间紧迫 – 花时间在写测试上会影相完成新需求的进度。或者是在浏览器上点击链接的测试习惯很难改变。

我曾经也是如此,我从1995年开始开发Web程序,但通常就像开发小型项目的独立开发者那样。除了小时候学过一下BASIC,在大学学过一些C++,还有在毕业后我的第二份工作中浪费了一个星期的Java,我从来没有好好地学习过软件开发。事实上,直到2005年,当我受够丑陋的意大利面条式的Php代码后,我发现一种更好的Web程序开发方法。

我以前曾关注过Ruby,不过直到Rails流行前都没有深度使用过它。因为这需要学习很多东西 – 新语言,新架构和更面向对象的方法(a more object-oriented approach)。不过虽然有这些新挑战,我还是能够在以前缺少框架努力的碎片时间下创造出复杂的程序。我知道我被吸引住了。

也就是说,早期Rails的书或指引都是更关注在开发速度上(15分钟搭建一个博客!)而不是更好的测试实践上。就算包括测试的讲解,它通常都是保留在最后一章。新运行于Rails的项目开始注意到这个缺陷,也已经有不少书的内容都有关于测试的章节,不过还缺少一套可行的测试方法。我写这个系列的目的,就是想向您介绍对我的方法。

#谁应该读这些文章

如果Rails是你第一个使用的Web程序开发框架,而且你以前的编程经验很少涉及到测试,那么这系列会很好地帮助你开始了解测试。如果你真的是Rails的菜鸟,你也能在Michael Hartl的《Rails Tutorial》或者 Sam Ruby的《Agile Web Development with Rails》里看到关于测试的部分。这一系列是假设你已经有基本的Rails使用经验之上的。换句话说,这一系列不会教你怎样使用Rails,它也不会提供内置的测试框架介绍 – 因为我们将要安装一些额外的工具使我们的测试过程更容易理解和管理。

如果你已经用Rails有一段时间了,或者你已经有一两个Rails产品了,但对测试仍然是一个陌生概念的话,这系列就适合你了。我曾经也和你一样,我在这里分享的技巧帮助我提交我的测试覆盖和使我更像一个测试驱动的开发者。我希望这些也能帮到你。

而如果你已经很熟悉Test::Unit或者RSpec,甚至有一个你已经很熟悉的或已经足够覆盖的工作流程,您可以微调你的一些方法来测试您的应用程序 – 不过说实在的,你可能已经使用自动化测试了而且不需要这些额外的帮助了。像David Chelimsky的《The RSpec Book》或者 Noel Rappin的《Rails Test Prescriptions》这些书对你来说可能更有用。

#我的测试哲学 讨论正确的方法来测试你的Rails可能会涉及到圣战 – 虽然不会像Vim和Emacs的争论那样,但仍然不是一个和其它Ruby开发者能开心讨论的话题。是的,虽然有一种正确的方法来做测试,但是也有正确的层次。

冒着在Ruby的TDD和BDD社区中掀起风暴的危险,我的讨论将关注以下几点:

  • 测试应该是可靠的
  • 测试应该是易写的
  • 测试应该是易理解的

如果你遵循这3步方法,那么对于你的程序可用的测试套件会有很长的路要走 - 更不用说成为测试驱动开发的忠实实践者了。

是的,有一些东西需要权衡,特别是:

  • 我们不注重速度
  • 我们在测试中不关注我们的代码完全DRY

最后,最重要的一点是,你将会得到可靠,易理解的测试样例,尽管它们不是很优化,但它们是一个很好的开始。也正是这样,使我免于陷入写大量的程序代码,然后在浏览器上点击”测试”,然后希望运行成功的循环中。而且还获得了完全自动化的测试套件的优势和使用测试驱动开发深挖潜在的bug。

准备好了?来就看第二部分吧:配置Rails程序来使用RSpec