使用Emma做Android覆盖率的实践

上一篇 / 下一篇  2015-09-15 11:04:18

回答几个问题

  • 为什么是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);
        }
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        generateCoverageReport();
    }
}


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来打开覆盖率文件



TAG: Android emma EMMA 覆盖率

 

评分:0

我来说两句

日历

« 2024-04-17  
 123456
78910111213
14151617181920
21222324252627
282930    

我的存档

数据统计

  • 访问量: 2026
  • 日志数: 1
  • 建立时间: 2015-09-15
  • 更新时间: 2015-09-15

RSS订阅

Open Toolbar