使用 Guard 在 Android 上进行持续测试
这些天我花了不少时间在写Ruby代码。然而,我却发现自己在Android平台上开发,中间来回使用着各种语言,像Ruby、Java和JavaScript,十分有趣。
我发现Java中缺少一种容易使用的库,就像Ruby的Guard。 Guard是一个能轻松处理文件系统修改事件的命令行工具。有了它,就可以让 连续测试更加容易。
例如,利用Guard,你可以创建一个Guardfile来监视你的文件系统(当然,你可以选择哪些类型的文件需要监视,像.rb文件等等);更重要的是,一旦这些目标文件发生变化(你添加一些代码)就会调用触发器,比如运行测试套件,调用Rake命令等等。因此,利用Guard,你可以设置一个当源文件改变时调用测试套件的执行过程(或者一个单独的测试) - 这样你就不必手动调用一个Rake任务或做其它事情来运行一个测试。
设置Guard来调用Ant。首先你必须安装Ruby,其次是 RubyGems和 Bundler。接下来,在你的Gemfile添加如下代码:
source :rubygems group :development do gem 'guard' gem 'growl' end
由于我使用的是Mac,我要用 Growl,它是一个操作系统级的通知机制,它会弹出一个对话框来通知你,你的测试是成功,失败等等。
接下来,你需要创建一个Guardfile - 在本例中,我将创建一个内联Guardfile,当没有插件可用时还能支持运行一些像Ant的东西。我的内联Guardfile代码如下:
require 'guard/guard' module ::Guard class Ant< ::Guard::Guard def run_all invoke_ant end def run_on_changes(paths) invoke_ant end def start invoke_ant end def stop end def invoke_ant system 'ant clean test' end end end guard 'ant' do watch(%r{^src/*/(.+)\.java$}) end
从上面可以看出,Guardfile会监视任何.java的文件。这些文件有任何改变,就会马上运行ant来清除测试。Guard基类相当的简单,通过它你可以实现一系列的相关方法。在这种情况下,start会第一时间启动Guard。run_on_changes则用于当传入的文件路径发生改变时,运行单个测试;然而,在本例中,我选择当参数传递到Ant再次运行该测试套件,并调用一个特殊的JUnit任务用于单个测试。最后,run_all会在一些特别情况下调用,比如在你修复了一个失败的测试后,等等。事实上,这些都是生命周期方法,你完全可以控制它们在什么情况下调用。
连续测试在Java中不是新的技术。例如,一个简单的搜索用Java的连续测试工具 Infinitest和 JUnit Max,这两个都是很好的工具,且都是IDE的插件,比如Eclipse。不过,我已经不用Eclipse有些日子了,改用IntelliJ(Infinitest也支持IntelliJ)。因此,这些天,我做的所有Android开发都是用IntelliJ。但是,我更倾向于用Ant构建Android工程(尽管Android上有一个 Maven库)。
最后我想说的就是,我想要一种简单的方式来连续运行测试,只要当我改变一个文件后,能随时运行,而不要我手动启动一个Ant/Rake/ Cake去构建测试,那它就是好的。