使用 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去構建測試,那它就是好的。