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>