Android持续集成以及测试覆盖率可视化
11zn8ta6
9年前
<h2>背景</h2> <p>很多开源项目在README中会有几个小图标来表示build情况,测试覆盖率等。如<img alt="Android持续集成以及测试覆盖率可视化" src="https://simg.open-open.com/show/9f55196bb3adec61ca5bf1ad5fcb5484.png" width="436" height="64"></p> <p>看起来感觉很牛逼的样子,其实实现起来很简单,只需几步,就能让你的开源项目也变得牛逼起来。</p> <h2>Travis-CI</h2> <p>Travis-CI是一款持续集成工具,对开源项目免费。免除了Jenkins搭建服务器的工作。用户只要完成以下简单的几步就能接入Travis。</p> <ol> <li>通过Github账号登录https://travis-ci.org/。</li> <li>在项目根目录添加.travis.yml 文件。</li> <li>git add -> commit -> push.</li> </ol> <p>之后再每次push之后Travis-CI就会根据.travis.yml对项目进行build。然后就可以在Travis网站控制台上查看build的情况。在build完成之后Travis也会通过邮件的方式通知你。</p> <p>在这三步中,最麻烦的一步就是.travis.yml的创建。具体文档可以参考官网。以下给出我的项目的yml文件作为例子分步分析。 完整文档:</p> <pre> <code>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> <p>告诉Travis-CI项目语言。这是必要的一步。</p> <pre> <code>language: android </code></pre> <p>设置JDK版本。非必要,但建议写上。</p> <pre> <code>jdk: - oraclejdk8 </code></pre> <p>设置环境变量</p> <pre> <code>env: matrix: - ANDROID_TARGET=android-21 ANDROID_ABI=armeabi-v7a global: - ADB_INSTALL_TIMEOUT=8 </code></pre> <p>matrix下面的配置会应用到当前build,而global应用到所有builds。matrix 下两项设置了TARGET api以及ABI,注意需要与Gradle中配置一致。global下这项设置了虚拟机安装apk的超时时间,如果你的项目不需要Instrument Test,可以不用加,但是如果有,且在持续集成中需要测试则需要加上,因为默认情况下安装超时时间为2分钟,某些情况下可能因为没有在2分钟内安装成功而导致集成失败。</p> <p>设置项目构建依赖</p> <pre> <code>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> <p>tools platform-tools 这两项表示该次build会使用最新的SDK tools, 这两项最好加上,因为如果没有,可能会报错说找不到指定版本的sdk tools。后面是对build-tools和compile sdk version的设置,注意与gradle中一致。如果你的项目中依赖了AppCompat和design support则需要加上extra-android-m2repository,extra-android-support这两项。最后一项是设置虚拟机版本,如果本次构建不需要用到虚拟机则不需要加。</p> <p>因为我们本次构建需要用到虚拟机来做Instrucment Test,所以需要打开虚拟机,可以在before_script中做这项工作</p> <pre> <code>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> <p>在script中用一些命令行指令来完成build工作。因为,我所用的项目只需要运行所有的Instrument单元测试用例并生成测试覆盖率报告,所以只需要加以下这句,这个Gradle任务是由Jacoco创建的,后面会详细介绍。注意–info最好加上,因为如果10分钟内没有输出,Travis—CI会认为build失败而结束build,–info让每完成一个测试方法都输出结果,因此能够防止这点。当然有可能单个测试方法运行时间超过10分钟的情况(Google Android 模拟器的蛋疼性能),所以单个测试方法应该竟可能小。</p> <pre> <code>script: - ./gradlew :lib:createDebugAndroidTestCoverageReport --info --stacktrace </code></pre> <p>after_success,顾名思义,在成功完成构建后会执行。这里的任务是将测试覆盖率报告发送给Codecov,后面会详细介绍。</p> <pre> <code>after_success: - bash <(curl -s https://codecov.io/bash) </code></pre> <h2>Jacoco</h2> <p>使用Jacoco生成测试覆盖率报告。只需要以下步骤:</p> <p>1) 添加依赖</p> <pre> <code> 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' </code></pre> <p>2) 在需要构建测试覆盖率报告的Module的gradle文件中设置。</p> <pre> <code>debug{ testCoverageEnabled true } </code></pre> <p>3) 运行 ./gradlew :module_name:createDebugAndroidTestCoverageReport 生成测试报告。测试报告地址:moudle_name/build/reports/coverage/debug/index.html。module_name为生成测试覆盖率的Moudle的名字。</p> <h2>Codecov</h2> <p>Codecov不支持自己生成Android的测试覆盖率报告,它能做的是接收Jacoco生成的报告并进行可视化,也就是上面那个表示测试覆盖率的小图标。</p> <p>集成Codecov只需要以下几个步骤。</p> <ol> <li>使用Github账号登录 https://codecov.io/, 并提供授权给该应用。</li> <li>在.travis.yml文件中添加命令将测试覆盖率报告上传给Codecov。</li> </ol> <p>上面提到的</p> <pre> <code>after_success: - bash <(curl -s https://codecov.io/bash) </code></pre> <p>就是将报告上传给Codecov。</p> <h2>总结</h2> <p>除了上面提到的,Travis还能做很多事情,比如自动打包发布等,留待读者自己探索。</p> <h2>参考</h2> <p><a href="/misc/goto?guid=4959672765894558942">http://jeroenmols.com/blog/2015/11/13/traviscoveralls/</a></p> <p><a href="/misc/goto?guid=4959662849033330315">https://docs.travis-ci.com</a></p> <p><a href="/misc/goto?guid=4958988066453135267">https://segmentfault.com/a/1190000004415437</a></p> <p>来自:<a href="/misc/goto?guid=4959672766031984655">sixwolf</a></p>