日韩性视频-久久久蜜桃-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 代码覆盖率测试入门的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日韩在线视频网站 | 性农村xxxxx小树林 | 最新地址在线观看 | 在线观看小视频 | 亚洲免费高清视频 | 精品1区2区3区 | 国产一区免费看 | 欧美成人a∨高清免费观看 国产精品999视频 | 欧美第四页 | 久久精品黄aa片一区二区三区 | 俺去草| 免费无遮挡在线观看视频网站 | 国产精品色婷婷99久久精品 | 男人插女人的网站 | 婷婷的五月天 | 国产性猛交xxxⅹ交酡全过程 | 天天看片天天射 | 已婚少妇美妙人妻系列 | 性网站在线观看 | 国产成人久久久 | 桃花岛影院 | 亚洲毛片一区二区三区 | 国产精品第二十页 | 久久久久国产一区二区三区 | 欧美 日韩 国产一区 | 日本特黄色片 | www.黄色一片 | juliaann欧美二区三区 | 玖玖爱在线观看 | 欧洲一区二区视频 | 欧美韩一区二区 | 国产97免费视频 | 伊人avav | 日韩欧美国产精品综合嫩v 国产小毛片 | 亚洲人人插 | 国产第九页 | 免费看60分钟黄视频 | a视频网站 | 刘玥91精选国产在线观看 | 丰满少妇一区二区三区专区 | 91视频xxx| 国产精品第二十页 | 午夜精品区 | 一级成人黄色片 | 久久国语| 在线观看69 | www操| 色综合天天综合综合国产 | 涩涩天堂 | 亚洲精品电影在线 | 国产黑丝91 | 国产微拍精品一区 | 99久久久久久 | 一区二区三区精品在线观看 | 成人免费黄色片 | 国产成人亚洲一区二区 | 国产欧美精品aaaaaa片 | 91视频福利 | 在线免费观看黄视频 | 国产一区二区影院 | 久久久久久穴 | 国产乱淫av片 | 中文字幕av一区 | 国产资源在线播放 | 国产一区二区三区乱码 | 偷拍久久久| 亚洲涩涩涩 | 亚洲高清福利 | 91av看片 | 美女四肢被绑在床扒衣 | 天堂av免费看 | 国产在线精品播放 | 福利网址在线 | 午夜成年人| 亚洲综合精品国产一区二区三区 | 在线观看免费视频黄 | 欧美综合激情 | 国产网站精品 | 成人免费毛片东京热 | 性生交大片免费看女人按摩 | 亚洲成人免费在线视频 | np视频 | 久久久久亚洲国产 | 蜜桃91精品入口 | 国产卡一卡二 | 日本韩国视频 | 中文字幕在线观看的网站 | 国产又粗又黄的视频 | 毛片毛片毛片毛片毛片毛片毛片 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 911精品国产一区二区在线 | 噼里啪啦免费高清看 | 超碰精品在线观看 | 亚洲一区二区三区日韩 | 国产一级片免费看 | 久精品在线 | 妇女一级片 | a亚洲精品 | 500部大龄熟乱视频 亚洲乱码精品 |