网站要放备案号吗,重庆网站推广多少钱,html知识点整理,wordpress 修改dns打不开前言最近同事搞了一个基于 jacoco 统计 Android 代码覆盖率测试的功能,可以统计每天手工测试的代码覆盖率.抱着好奇的心态,自己也学习一下 jacoco,陆陆续续搞了三天终于有点结果了.本文介绍仅仅在源码中加入少量代码就可以完成代码覆盖率覆测试.代码配置build.gradle在 app 目录…前言最近同事搞了一个基于 jacoco 统计 Android 代码覆盖率测试的功能,可以统计每天手工测试的代码覆盖率.抱着好奇的心态,自己也学习一下 jacoco,陆陆续续搞了三天终于有点结果了.本文介绍仅仅在源码中加入少量代码就可以完成代码覆盖率覆测试.代码配置build.gradle在 app 目录下的 build.gradle 配置 jacocoapply plugin: jacocojacoco {toolVersion 0.7.9}dependencies {compile fileTree(include: [*.jar], dir: libs)androidTestCompile(com.android.support.test.espresso:espresso-core:2.2.2, {exclude group: com.android.support, module: support-annotations})compile com.android.support:appcompat-v7:25.1.1compile org.jacoco:org.jacoco.core:0.7.9compile com.android.support.constraint:constraint-layout:}def coverageSourceDirs [../app/src/main/java]task jacocoTestReport(type: JacocoReport) {group Reportingdescription Generate Jacoco coverage reports after running tests.reports {xml.enabled truehtml.enabled true}classDirectories fileTree(dir: ./build/intermediates/classes/debug,excludes: [**/R*.class,**/*$InjectAdapter.class,**/*$ModuleAdapter.class,**/*$ViewInjector*.class])sourceDirectories files(coverageSourceDirs)executionData files($buildDir/outputs/code-coverage/connected/coverage.ec)doFirst {new File($buildDir/intermediates/classes/).eachFileRecurse { file -if (file.name.contains($$)) {file.renameTo(file.path.replace($$, $))}}}}写入 ec 文件自定义一个 JacocoUtils 类,可以根据反射拿到方法、类的执行代码,写入到.ec 文件public static void generateEcFile(boolean isNew) {// String DEFAULT_COVERAGE_FILE_PATH NLog.getContext().getFilesDir().getPath().toString() /coverage.ec;Log.d(TAG, 生成覆盖率文件: DEFAULT_COVERAGE_FILE_PATH);OutputStream out null;File mCoverageFilePath new File(DEFAULT_COVERAGE_FILE_PATH);try {if (isNew mCoverageFilePath.exists()) {Log.d(TAG, JacocoUtils_generateEcFile: 清除旧的ec文件);mCoverageFilePath.delete();}if (!mCoverageFilePath.exists()) {mCoverageFilePath.createNewFile();}out new FileOutputStream(mCoverageFilePath.getPath(), true);Object agent Class.forName(org.jacoco.agent.rt.RT).getMethod(getAgent).invoke(null);out.write((byte[]) agent.getClass().getMethod(getExecutionData, boolean.class).invoke(agent, false));Log.d(TAG,写入 DEFAULT_COVERAGE_FILE_PATH 完成! );} catch (Exception e) {Log.e(TAG, generateEcFile: e.getMessage());Log.e(TAG,e.toString());} finally {if (out null)return;try {out.close();} catch (IOException e) {e.printStackTrace();}}}使用 Application 生成 ec继承 Application 类,重写 onTrimMemory 方法,系统会根据不同的内存状态来回调系统提供的回调有Application.onTrimMemory()Activity.onTrimMemory()Fragement.OnTrimMemory()Service.onTrimMemory()ContentProvider.OnTrimMemory()OnTrimMemory的参数是一个int数值代表不同的内存状态TRIM_MEMORY_COMPLETE内存不足并且该进程在后台进程列表最后一个马上就要被清理TRIM_MEMORY_MODERATE内存不足并且该进程在后台进程列表的中部。TRIM_MEMORY_BACKGROUND内存不足并且该进程是后台进程。TRIM_MEMORY_UI_HIDDEN内存不足并且该进程的UI已经不可见了。可以根据 level TRIM_MEMORY_UI_HIDDEN 来确定 app 已经至于后台,此时调用 generateEcFile 方法.//判断是否是后台Overridepublic void onTrimMemory(int level) {super.onTrimMemory(level);if (level TRIM_MEMORY_UI_HIDDEN) {isBackground true;notifyBackground();}}private void notifyBackground() {// This is where you can notify listeners, handle session tracking, etcLog.d(TAG, 切到后台);JacocoUtils.generateEcFile(true);}操作步骤给予 app 读写 sdcard 权限因为我的是简单的 demo 代码,启动没有弹窗询问读写 sdcard 权限,Android6.0 以后是动态获取权限了,所以需要手动去设置中把 sdcard 权限打开,实际项目应该不存在手动打开的步骤.手工执行安装 app-操作 app-app 至于后台-分析 ec 文件.自动化执行可以结合 monkey 和 UI 自动化,我简单写了个 shell 脚本.从编译 app、启动 app、app 至于后台、自动展示 jacoco 报告#!/usr/bin/env bash#当前在环境为Project/app目录apk_pathpwd/app/build/outputs/apk/app-debug.apkreport_pathpwd/reporter/index.htmlecho 打包appgradle assembleDebugadb uninstall com.weex.jassoecho 安装appadb install ${apk_path}echo 启动appadb shell am start -W -n com.weex.jasso/.Test1Activity -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000sleep2echo 关闭appadb shell am force-stop com.weex.jassorm -rf pwd/new.ecrm -rf pwd/reportadb pull /sdcard/jacoco/coverage.ec pwd/new.ecmacaca coverage -r java -f pwd/new.ec -c pwd/app/build/intermediates/classes/debug -s pwd/app/src/main/java --html pwd/reporterecho jacoco报告地址:${report_path}open -a /Applications/Safari.app ${report_path}效果macaca coverage 生产报告使用 gradle 的 jacocoTestReport 也可以生产报告,也是大多人使用的方式,本文就不做介绍了,主要介绍使用 macaca coverage 方法.macaca coverage 可以生成 jacoco 报告,不仅可以生成 Android 项目,也可以生产 iOS、web 项目.具体使用请查看https://macacajs.github.io/zh/coverage.安装macaca-coverage命令:npm i macaca-cli -gmacaca coverage -hnpm i macaca-coverage --save-dev macaca coverage命令:macaca coverage -r java -f pwd/new.ec -c pwd/app/build/intermediates/classes/debug -s pwd/app/src/main/java --html pwd/reporter项目代码 https://github.com/xinxi1990/jacocodemo.git在项目根目录有个jacaco_test.sh,可以完成自动化测试.学习帖