日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

jacoco入门_Android jacoco 代码覆盖率测试入门

發布時間:2025/3/12 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jacoco入门_Android jacoco 代码覆盖率测试入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近同事搞了一個基于 jacoco 統計 Android 代碼覆蓋率測試的功能,可以統計每天手工測試的代碼覆蓋率.抱著好奇的心態,自己也學習一下 jacoco,陸陸續續搞了三天終于有點結果了.

本文介紹僅僅在源碼中加入少量代碼就可以完成代碼覆蓋率覆測試.

代碼配置

build.gradle

在 app 目錄下的 build.gradle 配置 jacoco

apply plugin: 'jacoco'

jacoco {

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.1'

compile 'org.jacoco:org.jacoco.core:0.7.9'

compile 'com.android.support.constraint:constraint-layout:+'

}

def coverageSourceDirs = [

'../app/src/main/java'

]

task jacocoTestReport(type: JacocoReport) {

group = "Reporting"

description = "Generate Jacoco coverage reports after running tests."

reports {

xml.enabled = true

html.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 方法.

//判斷是否是后臺

@Override

public 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, etc

Log.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_path=`pwd`/app/build/outputs/apk/app-debug.apk

report_path=`pwd`/reporter/index.html

echo "打包app"

gradle assembleDebug

adb uninstall com.weex.jasso

echo "安裝app"

adb install ${apk_path}

echo "啟動app"

adb shell am start -W -n com.weex.jasso/.Test1Activity -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000

sleep2

echo "關閉app"

adb shell am force-stop com.weex.jasso

rm -rf `pwd`/new.ec

rm -rf `pwd`/report

adb pull /sdcard/jacoco/coverage.ec `pwd`/new.ec

macaca coverage -r java -f `pwd`/new.ec -c `pwd`/app/build/intermediates/classes/debug -s `pwd`/app/src/main/java --html `pwd`/reporter

echo "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 -g

macaca coverage -h

npm 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,可以完成自動化測試.

學習帖

總結

以上是生活随笔為你收集整理的jacoco入门_Android jacoco 代码覆盖率测试入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 深夜福利网站 | 黄色小视频在线播放 | 五月激情片 | 少妇真实被内射视频三四区 | 日日夜夜一区二区 | 日本在线免费观看 | 精品视频在线观看 | 美女视频黄频视频大全 | 在线观看无遮挡 | 日本久久爱 | 中文字幕亚洲成人 | 亚洲av激情无码专区在线播放 | 丰满少妇xbxb毛片日本 | 日剧再来一次第十集 | 日韩精品视频免费 | 国产欧美高清 | 国产视频123区 | 日本黄色生活片 | 91成人毛片 | 少妇与公做了夜伦理 | h在线观看视频 | 男人猛进女人爽的大叫 | 丰满熟妇乱又伦 | 日日弄天天弄美女bbbb | 国产主播精品在线 | 婷婷超碰 | 午夜免费毛片 | 日本在线一本 | 久久一精品 | 久久久久亚洲av成人毛片韩 | 免费色播| 男人添女人下部高潮全视频 | 亚洲一区欧美二区 | 国产男女无遮挡猛进猛出 | 国产视频一区二区三区四区五区 | 一级黄色播放 | 日本东京热一区二区三区 | 99人妻少妇精品视频一区 | 蜜臀久久99精品久久一区二区 | 欧美黑人又粗又大又爽免费 | 亚洲天堂免费看 | 国产在线小视频 | av网站在线免费观看 | 国产黄色一级片视频 | 国产夫妻精品 | 91视频啊啊啊 | 传媒av在线| 精品一区二区三区免费毛片爱 | 久艹在线视频 | 久久大尺度 | 久久久综合网 | 五月天激情综合 | 久久综合日本 | 亚洲人午夜精品 | 在线免费观看一区二区 | 国产精品久久免费视频 | 超碰在线亚洲 | 东方欧美色图 | 男人深夜网站 | 天天曰天天 | beeg日本高清xxxx18 | 干干干操操操 | 久久婷婷五月国产色综合激情 | 国产精品一区三区 | 国产 欧美 精品 | 日本一区二区三区免费视频 | 成人免费毛片观看 | 十八禁一区二区三区 | 亚洲视频一区二区三区在线观看 | 阿v天堂2018| 欲色综合 | 国产激情一区 | 国产欧美一区二区三区免费看 | 在线一区二区视频 | 亚洲欧美在线成人 | 黄色在线观看av | 偷拍超碰| 丝袜美腿亚洲综合 | 日本涩涩网 | 精品不卡一区 | 午夜影院污 | 免费黄色入口 | 九色精品视频 | 国产精品伊人 | 日韩一级伦理片 | 夜夜草av | 日韩精品高清在线 | 欧美激情图片 | 性欧美videossex精品 | 美女视频黄色免费 | 在线观看毛片视频 | 成人在线免费播放 | www九九九 | 96精品 | 黄色小视频国产 | 九九人人| 午夜av网址 | japanese国产在线观看 | 中文字幕在线观看日本 |