使用Emma做Android覆盖率的实践

2024-04-20 10:18

本文主要是介绍使用Emma做Android覆盖率的实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

回答几个问题

  • 为什么是Emma
    Emma是Android内置的覆盖率支持的库,Android的SDK本身就含有Emma.jar的二方库。不用考虑引用外部
  • 插桩:基于代码还是基于编译出来的class
    本方案基于代码的方案,不过对代码无大的侵入性,使用方案简单。没有使用class的后插桩方案的原因主要有3点:
    • 在编译大型Android的方案的时候class文件比较多,插桩操作繁杂。
    • 插桩方案集成复杂: 涉及到在编译class之后,再重新打包和签名,所以过程要经过5,6步,比较麻烦不适合接入MTL等出集成包
    • 后插桩的方式出问题不容易调查,另外android内置的emma.jar是2.1版本,不支持tcp的方案实时获取coverage.ec数据

现在方案

  • 方案实现原理:
    基于Android的BroadCast方案,定义特定的消息,然后使用反射的方式使用android sdk中本身的emma获取coverage.ec数据并保存在/mnt/sdcard中,随时操作随时获取

实施步骤:

1. 将此类放入到代码中,类代码如下:

// package net.sf.andbatdog.batterydog.EmmaInstrument;
package com.qa.emma;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;import java.lang.Exception;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;public class InstrumentedReceiver extends BroadcastReceiver {public static String TAG = "EMMACoverageReport";private static final String DEFAULT_COVERAGE_FILE_PATH = "/mnt/sdcard/coverage.ec";private void reportEmmaError(Exception e) {reportEmmaError("", e);}private void reportEmmaError(String hint, Exception e) {String msg = "Failed to generate emma coverage. " + hint;Log.e(TAG, msg, e);}private void generateCoverageReport() {Log.d(TAG, "generateCoverageReport()");java.io.File coverageFile = new java.io.File(DEFAULT_COVERAGE_FILE_PATH);try {Class<?> emmaRTClass = Class.forName("com.vladium.emma.rt.RT");Method dumpCoverageMethod = emmaRTClass.getMethod("dumpCoverageData", coverageFile.getClass(), boolean.class,boolean.class);dumpCoverageMethod.invoke(null, coverageFile, true, false);} catch (ClassNotFoundException e) {reportEmmaError("Emma.jar not in the class path?", e);} catch (Exception e){reportEmmaError(e);}}@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubgenerateCoverageReport();}
}


2. 编辑AndroidManifest.xml文件:

  1. 增加SDCard的写权限
  2. 增加BroadCast的通知映射
<receiver android:name="com.qa.emma.InstrumentedReceiver"><intent-filter><action android:name="com.qa.emma.COLLECT_COVERAGE"/></intent-filter>
</receiver>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3. 编译
ant instrument

4. 安装
ant installi

5. 执行测试用例

6. 发送BroadCast通知获取结果

adb shell am broadcast -a com.qa.emma.COLLECT_COVERAGE

7. 获取 coverage.ec

adb push /mnt/sdcard/coverage.ec

8. 生成报告
保证自己在代码路径下,执行如下命令:

java -cp %ANDROID_HOME%\tools\lib\emma.jar emma report -r html -sourcepath src -in bin\coverage.em,coverage.ec

这样就可以看到coverage目录下的index.html来打开覆盖率文件


这篇关于使用Emma做Android覆盖率的实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919988

相关文章

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四