在笔者开发的系统中,有大量的数据需要分析,不仅要求数据分析准确,而且对速度也有一定的要求的。没有写测试代码之前,笔者用几个很大的方法来实现这种需求。结果可想而知,代码繁杂,维护困难,难于扩展。借业务调整的机会,笔者痛定思痛,决定从测试代码做起,并随着不断地学习和应用,慢慢体会到测试代码的好处。

    改变思路:能做到从需求到代码的过程转换,逐步细化;

    简化代码:力图让每个方法都很小,只专注一件事;

    优化代码:当测试代码写不出来,或者需要写很长的时候,说明代码是有问题的,是可以被分解的,需要进一步优化;

    便于扩展:当扩展新业务或修改旧业务时,如果测试代码没有成功,则说明扩展和修改不成功;

    时半功倍:貌似写测试代码很费时,实际在测试、部署和后续扩展中,测试代码将节省更多的时间。

    环境搭建

    笔者采用的测试环境是比较流行通用的框架:RSpec + Factory Girl,并用autotest自动工具。RSpec是一种描述性语言,通过可行的例子描述系统行为,非常容易上手,测试用例非常容易理解。Factory Girl可以很好的帮助构造测试数据,免去了自己写fixture的烦恼。Autotest能自动运行测试代码,随时检测测试代码的结果,并且有很多的插件支持,可以让测试结果显示的很炫。

    第一步 安装rspec和rspec-rails

    在命令行中执行如下命令:

    $ sudo gem install rspec v = 1.3.0  $ sudo gem install rspec-rails v = 1.3.2

    安装完成后,进入rails应用所在的目录,运行如下脚本,生成spec测试框架:

    $ script/generate rspec   exists lib/tasks  identical lib/tasks/rspec.rake  identical script/autospec  identical script/spec  exists spec  identical spec/rcov.opts  identical spec/spec.opts  identical spec/spec_helper.rb

    第二步 安装factory-girl

    在命令行中执行如下命令:

    $ sudo gem install factory-girl

    在config/environment/test.rb中,加入factory-girl这个gem:

    config.gem "factory_girl"

    在spec/目录下,增加一个factories.rb的文件,用于所有预先定义的model工厂。

    第三步 安装autotest

    在命令行中执行如下命令:

    $ sudo gem install ZenTest  $ sudo gem install autotest-rails

    然后设置与RSpec的集成,在rails应用的目录下,运行如下的命令,可以显示测试用例的运行结果。

    RSPEC=true autotest or autospec

    在自己的home目录下,增加一个。autotest设置所有的Rails应用的autotest插件。当然,也可以把这个文件加到每个应用的根目录下,这个文件将覆盖home目录下的文件设置。autotest的插件很多,笔者用到如下的plugin:

    $ sudo gem install autotest-growl  $ sudo gem install autotest-fsevent  $ sudo gem install redgreen

    设置。autotest文件,在。autotest中,加入如下代码。

    require ‘autotest/growl‘   require ‘autotest/fsevent‘   require ‘redgreen/autotest‘   Autotest.add_hook :initialize do |autotest|  %w{.git .svn .hg .DS_Store ._* vendor tmp log doc}.each do |exception|  autotest.add_exception(exception)  end  end