Android持續集成以及測試覆蓋率可視化
背景
很多開源項目在README中會有幾個小圖標來表示build情況,測試覆蓋率等。如
看起來感覺很牛逼的樣子,其實實現起來很簡單,只需幾步,就能讓你的開源項目也變得牛逼起來。
Travis-CI
Travis-CI是一款持續集成工具,對開源項目免費。免除了Jenkins搭建服務器的工作。用戶只要完成以下簡單的幾步就能接入Travis。
- 通過Github賬號登錄https://travis-ci.org/。
- 在項目根目錄添加.travis.yml 文件。
- git add -> commit -> push.
之后再每次push之后Travis-CI就會根據.travis.yml對項目進行build。然后就可以在Travis網站控制臺上查看build的情況。在build完成之后Travis也會通過郵件的方式通知你。
在這三步中,最麻煩的一步就是.travis.yml的創建。具體文檔可以參考官網。以下給出我的項目的yml文件作為例子分步分析。 完整文檔:
language: android
jdk:
- oraclejdk8
env:
matrix:
- ANDROID_TARGET=android-21 ANDROID_ABI=armeabi-v7a
global:
- ADB_INSTALL_TIMEOUT=8
android:
components:
- tools
- platform-tools
- build-tools-23.0.2
- android-23
- extra-android-m2repository
- extra-android-support
- sys-img-armeabi-v7a-android-21
before_script:
- echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
- emulator -avd test -no-skin -no-audio -no-window &
- android-wait-for-emulator
- adb shell input keyevent 82 &
script:
- ./gradlew :lib:createDebugAndroidTestCoverageReport --info --stacktrace
after_success:
- bash <(curl -s https://codecov.io/bash)
</code></pre>
告訴Travis-CI項目語言。這是必要的一步。
language: android
設置JDK版本。非必要,但建議寫上。
jdk:
- oraclejdk8
</code></pre>
設置環境變量
env:
matrix:
- ANDROID_TARGET=android-21 ANDROID_ABI=armeabi-v7a
global:
- ADB_INSTALL_TIMEOUT=8
</code></pre>
matrix下面的配置會應用到當前build,而global應用到所有builds。matrix 下兩項設置了TARGET api以及ABI,注意需要與Gradle中配置一致。global下這項設置了虛擬機安裝apk的超時時間,如果你的項目不需要Instrument Test,可以不用加,但是如果有,且在持續集成中需要測試則需要加上,因為默認情況下安裝超時時間為2分鐘,某些情況下可能因為沒有在2分鐘內安裝成功而導致集成失敗。
設置項目構建依賴
android:
components:
- tools
- platform-tools
- build-tools-23.0.2
- android-23
- extra-android-m2repository
- extra-android-support
- sys-img-armeabi-v7a-android-21
</code></pre>
tools platform-tools 這兩項表示該次build會使用最新的SDK tools, 這兩項最好加上,因為如果沒有,可能會報錯說找不到指定版本的sdk tools。后面是對build-tools和compile sdk version的設置,注意與gradle中一致。如果你的項目中依賴了AppCompat和design support則需要加上extra-android-m2repository,extra-android-support這兩項。最后一項是設置虛擬機版本,如果本次構建不需要用到虛擬機則不需要加。
因為我們本次構建需要用到虛擬機來做Instrucment Test,所以需要打開虛擬機,可以在before_script中做這項工作
before_script:
- echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
- emulator -avd test -no-skin -no-audio -no-window &
- android-wait-for-emulator # 該項會等待虛擬機啟動成功在執行后面的命令
- adb shell input keyevent 82 &
</code></pre>
在script中用一些命令行指令來完成build工作。因為,我所用的項目只需要運行所有的Instrument單元測試用例并生成測試覆蓋率報告,所以只需要加以下這句,這個Gradle任務是由Jacoco創建的,后面會詳細介紹。注意–info最好加上,因為如果10分鐘內沒有輸出,Travis—CI會認為build失敗而結束build,–info讓每完成一個測試方法都輸出結果,因此能夠防止這點。當然有可能單個測試方法運行時間超過10分鐘的情況(Google Android 模擬器的蛋疼性能),所以單個測試方法應該竟可能小。
script:
- ./gradlew :lib:createDebugAndroidTestCoverageReport --info --stacktrace
</code></pre>
after_success,顧名思義,在成功完成構建后會執行。這里的任務是將測試覆蓋率報告發送給Codecov,后面會詳細介紹。
after_success:
- bash <(curl -s https://codecov.io/bash)
</code></pre>
Jacoco
使用Jacoco生成測試覆蓋率報告。只需要以下步驟:
1) 添加依賴
androidTestCompile 'com.android.support.test:runner:0.4.1'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4.1'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1'
2) 在需要構建測試覆蓋率報告的Module的gradle文件中設置。
debug{
testCoverageEnabled true
}
3) 運行 ./gradlew :module_name:createDebugAndroidTestCoverageReport 生成測試報告。測試報告地址:moudle_name/build/reports/coverage/debug/index.html。module_name為生成測試覆蓋率的Moudle的名字。
Codecov
Codecov不支持自己生成Android的測試覆蓋率報告,它能做的是接收Jacoco生成的報告并進行可視化,也就是上面那個表示測試覆蓋率的小圖標。
集成Codecov只需要以下幾個步驟。
- 使用Github賬號登錄 https://codecov.io/, 并提供授權給該應用。
- 在.travis.yml文件中添加命令將測試覆蓋率報告上傳給Codecov。
上面提到的
after_success:
- bash <(curl -s https://codecov.io/bash)
</code></pre>
就是將報告上傳給Codecov。
總結
除了上面提到的,Travis還能做很多事情,比如自動打包發布等,留待讀者自己探索。
參考
http://jeroenmols.com/blog/2015/11/13/traviscoveralls/
https://segmentfault.com/a/1190000004415437
來自:sixwolf