之前在 https://www.cnblogs.com/zhouxihi/p/11453738.html 这篇写了一种统计Android覆盖率的方式

但是对于一些比较复杂或者代码结构不够规范的项目,有可能会出现统计不全的问题

这里记录下另外一种统计覆盖率的方法

之前提到的方式大致流程是: 启动APP -> 执行测试 -> 返回桌面 -> 生产覆盖率文件

今天要讲的方式大致流程是: 启动APP -> 执行测试 -> 发送adb请求 -> 生产覆盖率文件

具体步骤:

1. 在主activity的onCreate方法后面加上一段启动代码

override fun onCreate() {
..........
..........
// 代码覆盖率统计
Toast.makeText(this, "代码覆盖率数据统计开始", Toast.LENGTH_SHORT).show()
val finishReceiver = FinishReceiver()
val filter = IntentFilter()
filter.addAction("com.kevin.testool.coverage.finish")
registerReceiver(finishReceiver, filter)
}

2. 在主activity中添加一个广播接收器

inner class FinishReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
JacocoUtils.generateEcFile(intent.getBooleanExtra("IS_NEW", false)) } }

3. 在主activity添加相关依赖(可能有漏,检查一下没有报错就行)

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.os.Bundle

4. 在app>src>main>java>com.xxxxxx工程目录下新建一个名为codecoverage的目录,其中放一个JacocoUtils.java

代码如下:

package com.xxxxx.xxxxxx.codecoverage;

import android.os.Environment;
import android.util.Log; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream; public class JacocoUtils {
static String TAG = "JacocoUtils"; //ec文件的路径
private static String DEFAULT_COVERAGE_FILE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "coverage.ec"; /**
* 生成ec文件
*
* @param isNew 是否重新创建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)); } catch (Exception e) {
Log.e(TAG, "generateEcFile: " + e.getMessage());
} finally {
if (out == null)
return;
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

4. 修改build grade

参考这里配置就行: https://www.cnblogs.com/zhouxihi/p/11453738.html

5. 打包apk

6.安装测试, 测试中途不要杀掉app, 测试完使用adb下发命令出发生成覆盖率数据

adb shell am broadcast -a com.kevin.testool.coverage.finish

如果是统计自动化测试覆盖率,可以在每次杀掉进程前执行一次adb命令等待几秒

7. 生产覆盖率报告的方式跟上篇一样

Android自动化测试探索(七)代码覆盖率统计的更多相关文章

  1. Android自动化测试探索

    Android自动化测试探索 前言 通常来说,我们开发完成产品之后,都是由测试组或者是我们自己点一点,基本上没有问题了就开始上线.但是,随着时间的堆叠,一款产品的功能也越来越多.这时,我们为了保证产品 ...

  2. Android自动化测试探索(五)代码覆盖率统计

    Android 代码覆盖率统计 本周开始准备统计Android自动化用例的代码覆盖率,将最终使用的方法记录下来. 覆盖率监测的原理 覆盖率监测的原理跟iOS上的原理差不多,大致的思路参考下吧, iOS ...

  3. Android自动化测试探索(二)常用自动化工具

    Android常用自动化工具 ADB - 是Google提供的为Android编写UI测试用例的自动化工具, Android开发/测试人员不可替代的强大工具 uiautomator - 是Google ...

  4. Android 自动化测试—robotium(七) 使用Junit_report测试报告

    使用Robotium进行测试的时候,要想可以导出明了的测试结果,可以使用junitreport来实现 junit-report下载地址:https://github.com/jsankey/andro ...

  5. Android自动化测试探索(三)Android SDK tools安装、aapt配置以及使用aapt获取apk包名

    Android SDK tools安装 下载连接: https://www.androiddevtools.cn 找到对应mac的版本下载安装即可 AAPT配置 #1. 进入根目录 cd ~ #2. ...

  6. Android自动化测试探索(四)uiautomator2简介和使用

    uiautomator2简介 项目Git地址: https://github.com/openatx/uiautomator2 安装 #1. 安装 uiautomator2 使用pip进行安装, 注意 ...

  7. Android自动化测试探索(一)adb详细介绍

    adb详细介绍 #1. 基本简介 adb,即Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具 #2. Mac上安装adb 安装brew /usr/bin/r ...

  8. iOS自动化探索(十)代码覆盖率统计

    iOS APP代码覆盖率统计 今年Q3季度领导给加了个任务要做前后端代码覆盖率统计, 鉴于对iOS代码代码比较熟就选择先从iOS端入手,折腾一整天后终于初步把流程跑通了记录如下 覆盖率监测的原理 Xc ...

  9. Android自动化测试基础知识——MONKEY测试工具(转的)

    本周开始启动手机输入法simeiji的自动化测试,同时开始接触手机浏览器自动化测试.接下来会对android自动化测试工具和方法做一个专题研究. 第一篇介绍monkey测试工具. 1 自动化测试背景 ...

随机推荐

  1. h5开发安卓机型点击输入框调起输入法,输入框被键盘遮挡的解决方法

    前言: 从以前的项目中找一个问题的解决方案,顺带找到了这个安卓机型调起输入法,页面没有自动上滑导致输入框被弹起的键盘遮挡的解决方案.这个问题只有安卓机型页面中的输入框处于底部(也就是底部键盘区域)的时 ...

  2. Blob/DataURL/canvas/image的相互转换

    函数都比较简单,直接看就ok了 /*-----------------------------------------------------------------------*/ // canva ...

  3. python调用kafka服务(使用kafka-python库)

    试验环境: CDH 5.15.1 CentOS 7 Python 3.7.0 kafka 1.1.1 kafka-python :https://pypi.org/project/kafka-pyth ...

  4. Linux学习-防火墙-Selinux-配置本地YUM源

    关闭防火墙并设置开机不启动 systemctl status firewalld.service #查看firewalld状态systemctl stop firewalld #关闭systemctl ...

  5. 用easyui从servlet传递json数据到前端页面的两种方法

    用easyui从servlet传递json数据到前端页面的两种方法 两种方法获取的数据在servlet层传递的方法相同,下面为Servlet中代码,以查询表中所有信息为例. //重写doGet方法 p ...

  6. django下创建多个app,如何设置每个app的urls

    1.创建第二个app 假设我们项目P下面已经有了一个默认的app,名字是app1.现在我想创建第二个app,名字时app2. 进入pychram下的Terminal中,运行命令: python man ...

  7. 【LEETCODE】45、766. Toeplitz Matrix

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  8. 使用PrintDocument定制打印格式

    虽然说使在IE上直接调用打印插件打印已经不常用,但是有时候还是会用到,这里就记录一下. 首先我们列出来我们的打印类 public class PrintService { //打印机名称 privat ...

  9. IOS - 总结下swift使用GCD 多线程(二)GCD和DispatchQueue

    1.前言  iOS中处理多核并发的技术有两种分别是:`Grand Central Dispatch`(以下简称`GCD`)和`NSOperationQueue`框架.iOS开发的老司机们在程序开发中处 ...

  10. php生成一维码以及保存-转载

    地址:http://www.cnblogs.com/ForEvErNoME/archive/2012/04/21/2460944.html 注释掉: //header('Content-Type: i ...