本文主要是介绍使用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文件:
- 增加SDCard的写权限
- 增加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覆盖率的实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!