
凡事先從官網開始 Android Develop Testing。如果是個人開發,官網的方式應該也夠用了。如果要講求測試的時間,建議把 Code 分成單純的 Java 和 Android ,這樣一來,Java Code 的部分可以透過的 JUnit Test 處理,需要測試UI時再透過手機或 AVD 進行,當然,速度會稍微慢一點。
p.s.1 如果你的 Android Studio 版本高於 1.4,SDK版本高於 22+,在搞定環境的過程可能會遇到版本不相容的問題,官方提供的 junit:junit:4.12 似乎只支援到 SDK:22。不過我在兩台電腦分別遇到不同的問題,基本上還是要拿關鍵字去問 Google,有很大的機會可以在 Stackoverflow 找到解答 = =
p.s.2 我自己測試的 Android Studio 版本裡,1.3.1似乎是問題最少的,大概是相關的 Library 都有支援吧
Robolectric Framework
官網提供的方式必須透過裝置才能測試 UI ,原因是 Android Studio 只提供開發和編譯環境,所以硬要在 IDE 裡面執行這些 Android 測試會產生 throw RuntimeException("stub!!”);
而 Robolectric 就是實作了一套可以在 JVM 上面跑的 Android,所以我們就可以在 JVM 的環境下測試 Android,有興趣的可以參考這篇文章:用Robolectric做Android unit testing。實際照著做就會發現一堆問題,主要是版本不太一樣了,目前的 Robolectric 穩定版是 3.0,SNAPSHOT 是3.1,不過我自己測試 3.1-SNAPSHOT 是掛點的狀況。
如果想要讓測試部分獨立成一個專案,可以參考這篇文章:[TUT] Android Gradle App with Robolectric JUnit tests。概略的說,就是直接 import new module --> java library 。主要的問題一樣是出現在搞定 build.gradle 上面,不過,專案夠乾淨的話應該問題不大。要注意的是文章裡面的版本更舊,Robolectric 還停留在 2.2。手動換成 3.0 以後會發現有些程式碼會跳 cannot resolve constructor 或 cannot resolve method ,只能自己參考官方文件修正:Robolectric 3.0 Javadocs,或者是幾個不同的網站交叉參考。
p.s. 我主要是根據 Android Gradle App with Robolectric JUnit tests 這篇文章佈建環境,在 RobolectricGradleTestRunner 裡,記得要加個 String assetsProperty 的變數,再丟到 new AndroidManifest () 裡面,Android Sturdio 會告訴你該加在哪邊,然後 MyAndroidClassTest 要記得加上 @Config(constants = BuildConfig.class, sdk = 21)
p.s. 特別要注意的是 Robolectric 官網的 Getting Started 有一段 Note for Linux and Mac Users,提到資料夾要設定,我在 Windows 7 下面有出現 AndroidManifest.xml not found in RobolectricGradleTestRunner。我的 solution 是將 Run --> Edit Editconfigurations... --> Junit --> Working directory 設定成 MyProjectPath\app。記得把 MyProjectPath 換成自己的專案路徑。
如果環境都沒問題,再寫個 assertEquals(true, true) 測試看看(我沒有使用文章裡建議的測試程式碼),應該可以看到綠色的測試通過,環境就算是佈建完成了。
接下來就是持續整合、自動測試的事情了,還沒開始做,所以只能寫到這裡了。
0 意見:
張貼留言