Android持續集成以及測試覆蓋率可視化

11zn8ta6 8年前發布 | 9K 次閱讀 Android 測試 Android開發 移動開發

背景

很多開源項目在README中會有幾個小圖標來表示build情況,測試覆蓋率等。如Android持續集成以及測試覆蓋率可視化

看起來感覺很牛逼的樣子,其實實現起來很簡單,只需幾步,就能讓你的開源項目也變得牛逼起來。

Travis-CI

Travis-CI是一款持續集成工具,對開源項目免費。免除了Jenkins搭建服務器的工作。用戶只要完成以下簡單的幾步就能接入Travis。

  1. 通過Github賬號登錄https://travis-ci.org/。
  2. 在項目根目錄添加.travis.yml 文件。
  3. 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只需要以下幾個步驟。

  1. 使用Github賬號登錄 https://codecov.io/, 并提供授權給該應用。
  2. 在.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://docs.travis-ci.com

https://segmentfault.com/a/1190000004415437

來自:sixwolf

 本文由用戶 11zn8ta6 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!