一文带你揭秘如何采取非instrumentation启动app,打造实时统计覆盖率,一键触发覆盖率测试报告。


  在上篇文章,一文带你解决Android app手工测试或者自动化测试覆盖率统计(撸代码版),我们采用了instrumentation的方式去启动app,很多人会问,如果我们不用instrumentation启动app的方式,正常启动app进行测试,然后收集覆盖率可以吗,答案,是可以的,如何做呢,下面带你去揭晓其中的奥秘。

首先呢,我们还是基于我们的工作,去申请我们的读写的权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  

申请后,我们在安装app的时候一定要给予这两个权限,接下来呢,我们去配置jacoco相关的。

在项目的build.gradle配置相关的,如下配置

apply plugin: 'jacoco'
jacoco {
toolVersion = "0.8.4"
description("$buildDir/coverage.exec")
reportsDir = file("$buildDir/reports/jacoco")
}

  

首先我们去添加jacoco的插件,接着呢,我们去规定版本,然后去规定我们的覆盖文件的位置,接下来我们去告知下测试报告的位置。这样我们配置好了依赖,我们需要在debug打开覆盖率。还是同一个的build.gradle配置

 debug {           
/**打开覆盖率统计开关*/
testCoverageEnabled = true
minifyEnabled false //获取代码覆盖率需要设为false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }

  

配置完毕后呢,我们去编写一个jacoco的工具类,用来处理覆盖率文件的写入。具体代码如下
package com.example.studayapp.test;

import android.content.Context;
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"; private static String DEFAULT_COVERAGE_FILE_PATH = "coverage.exec"; /**
* 生成ec文件
*
* @param isnew 是否重新创建exec文件
*/
public static void generateEcFile(boolean isnew) {
Log.d(TAG, "生成覆盖率文件: " + DEFAULT_COVERAGE_FILE_PATH);
OutputStream out = null;
File mCoverageFilePath = new File(Environment.getExternalStorageDirectory(),DEFAULT_COVERAGE_FILE_PATH); try {
if (isnew && mCoverageFilePath.exists()) {
Log.d(TAG, "清除旧的exec文件");
mCoverageFilePath.delete();
}
if (!mCoverageFilePath.exists()) {
mCoverageFilePath.createNewFile();
}
out = new FileOutputStream(mCoverageFilePath.getPath(), true); //反射:获取org.jacoco.agent.rt.IAgent
Object agent = Class.forName("org.jacoco.agent.rt.RT")
.getMethod("getAgent")
.invoke(null); //反射:getExecutionData(boolean reset),获取当前执行数据,
// 以jacoco二进制格式转储当前执行数据
// getExecutionData(boolean reset),reset如果为true,则之后清除当前执行数据
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();
}
}
}
}

  


我们通过反射:获取org.jacoco.agent.rt.IAgent,然后,反射:getExecutionData(boolean reset),获取当前执行数据,最后写入执行的数据。

这样我们收集的数据的脚本下好呢,那么我们应该怎么去收集我们的数据呢,之前的文章是通过系统的返回键后去生成的,这样呢,其实在我们实际的工作中呢,是不常见呢,很多的时候呢,我们需要在特定的时候才去触发呢,这里呢,我的做法呢,是在设置中,增加一个按钮,生成测试覆盖率的 按钮来统一处理。

<Button                    
android:id="@+id/statistics"
android:layout_width="match_parent" android:layout_height="wrap_content" android:text="统计覆盖率">
</Button>

在布局文件呢,我们去创建一个按钮,然后呢,我们去在这个按钮去监听点击事件。

statistics=(Button) findViewById(R.id.statistics);
statistics.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
JacocoUtils.generateEcFile(true);
}
});

  

    这样呢,我们去安装我们的app的debug版本

然后呢,我们去正常测试,最后呢,我们去点击我们的按钮。生成完毕后,如下。

我们去在项目的目录下,我们去pull下来即可。

adb pull /sdcard/coverage.exec .

     然后,我们在build.gradle创建一个任务。

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/javac/debug/classes',
excludes: ['**/R*.class', '**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/coverage.exec") doFirst {
new File("$buildDir/intermediates/javac/debug/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}

  然后点击

执行完毕后。

我们看下实际的效果

可以看到有测试报告,我们打开看下。

这是最后的覆盖率测试的统计数据。

这里的数据呢,只是统计到了全量代码的,还有增量代码覆盖率统计,多个覆盖率文件的不同的如何进行组合。后续的文章会持续分享。

 

安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)的更多相关文章

  1. 从0到1搭建移动App功能自动化测试平台(2):操作iOS应用的控件

    转自:http://debugtalk.com/post/build-app-automated-test-platform-from-0-to-1-Appium-interrogate-iOS-UI ...

  2. 从0到1搭建移动App功能自动化测试平台(0):背景介绍和平台规划

    本文作者: 伯乐在线 - debugtalk .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 转载地址:http://blog.jobbole.com/101221/ 背景 最近新加入DJI的 ...

  3. Appium 从 0 到 1 搭建移动 App 功能自动化测试平台 (1):模拟器中运行 iOS 应用

    转载:https://testerhome.com/topics/4960 在上一篇文章中,我对本系列教程的项目背景进行了介绍,并对自动化测试平台的建设进行了规划. 在本文中,我将在已准备就绪的iOS ...

  4. 基于JaCoCo的Android测试覆盖率统计(二)

    > 本文章是我上一篇文章的升级版本,详见地址:https://www.cnblogs.com/xiaoluosun/p/7234606.html ## 为什么要做这个?1. 辛辛苦苦写了几百条测 ...

  5. APICloud云修复再升级 增加热重启APP功能

    移动应用开发平台APICloud的亮点功能云修复在本月迎来升级版,云修复是APICloud的优势功能之一,通过APICloud平台开发的APP或者嵌入SuperWebView SDK的原生APP在发布 ...

  6. 哪些产品不用开发原生APP,微信公众号就够了?

    最近一阶段H5技术被推到高峰,很多人认为借助H5就能利用微信公众号取代APP原生应用了,而事实是怎么样的?这里我从产品层做一个客观分析. 一,原生APP总体趋势 要谈APP是否会被微信取代,那么必须回 ...

  7. 开源API测试工具 Hitchhiker v0.8 - 自动化测试结果统计

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持自动化测试, 数据对比,压力测试,支持脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试Api. ...

  8. Beta版——爱阅APP功能说明书

    爱阅APP功能说明书 一.引言 通过Alpha发布和一些用户的反馈信息,了解到我们APP存在的问题.针对这些问题我们做了一些修改.以下内容是Beta版的功能说明书. 二.工具 安卓手机 爱阅APP安装 ...

  9. final版——爱阅APP功能说明书

    爱阅APP功能说明书 一.引言 以下内容是final版的功能说明书. 新增功能: 1.WiFi传书 2.书友群跳转 3.网址内部打开 4.设置-->关于爱阅 5.设置-->TXT文本的翻页 ...

随机推荐

  1. 没想到,Git居然有3种“后悔药”!

    没想到,Git居然有后悔药! 你知道Git版本控制系统中都有哪些"后悔药"吗? 本文通过案例讲解git reset . git revert . git checkout在版本控制 ...

  2. 【转】对初学LoadRunner朋友的建议

    对初学LoadRunner朋友的建议 作者:wind摘要:随着Internet的普及与迅速发展,企业业务量的迅速加大,数据大集中成为一种趋势,IT系统承载的负荷越来越重,系统性能的好坏严重的影响了企业 ...

  3. 【已学完】UGUI Schedule

    章节 内容 签到 Unity4.6 New UI(UGUI) 1.UGUI概述与Canvas画布介绍(一) 5月14日 2.Canvas画布介绍(二) 5月14日 3.Text控件 5月14日 4.I ...

  4. 模拟CMOS集成电路 课后习题总结(2.1)

    前几天开始自学拉扎维的模设教材,看之前浏览了EETOP论坛里面好多大神们对这本书的看法,当然也有人在抱怨,比如冒出“太科幻”.“一年才看完”之类恐怖的修饰语句,因此在开始看的时候就对此书充满了“敬畏” ...

  5. 面试:为了进阿里,又把并发CAS(Compare and Swap)实现重新精读一遍

    该系列文章已收录在公众号[Ccww技术博客],原创技术文章第一时间推出 前言 在面试中,并发线程安全提问必然是不会缺少的,那基础的CAS原理也必须了解,这样在面试中才能加分,那来看看面试可能会问那些问 ...

  6. Java反射(一)

    什么是反射? 在程序的运行过程中,可以动态的创建对象. 反射的基石是什么? 字节码对象是反射的基石.字节码对象:Java类文件通过javac进行编译后生成的xxx.class文件,此文件由jvm加载至 ...

  7. nginx的gzip压缩

    随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? gzip(GNU-ZIP)是一种压缩技术.经过gzi ...

  8. ASP.NET Core 3.x Razor视图运行时刷新实时编译

    前言: 很长一段时间没有写过ASP.NET Core Razor(.cshtml)视图开发WEB页面了,今天刚好把之前做的一个由ASP.NET Core 2.2+Razor开发的项目升级到ASP.NE ...

  9. Kafka入门(4):深入消费者

    摘要 在这一篇文章中,我将向你介绍消费者的一些参数. 这些参数影响了每次poll()请求的数据量,以及等待时间. 在这之后,我将向你介绍Kafka用来保证消费者扩展性以及可用性的设计--消费者组. 在 ...

  10. Oracle数据库之表与表数据操作

    一.SQL语言 SQL语言分为四种,分别是:数据定义语言(DDL).数据操纵语言(DCL).事务控制语言(TCL).数据控制语言(DML). 1.1 数据定义语言(DDL) 建立.修改.删除数据库对象 ...