以下代码时监听测试程序结束后将Emma测试报告写入到虚拟机上,然后可以使用adb pull命令发送至硬盘上,这里需要测试程序集成Emma jar包,并需要修改ant build文件。
package com.example.instrumentation;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import com.example.i2at.tc.TemperatureConverterActivity;//import com.vladium.emma.rt.RT;import android.app.Activity;import android.app.Instrumentation;import android.content.Intent;import android.os.Bundle;import android.os.Looper;import android.util.Log;public class EmmaInstrumentation extends Instrumentation implements FinishListener {    private static final String TAG = "EmmaInstrumentation";    private static final boolean LOGD = true;    private static final String DEFAULT_COVERAGE_FILE_PATH = "/mnt/sdcard/coverage.ec";    private final Bundle mResults = new Bundle();    private Intent mIntent;    private boolean mCoverage = true;    private String mCoverageFilePath;    /**     * Extends the AUT to provide the necessary behavior to invoke the     * {@link FinishListener} that may have been provided using     * {@link #setFinishListener(FinishListener)}.     *      * It's important to note that the original Activity has not been modified.     * Also, the Activity must be declared in the     * <code>AndroidManifest.xml</code> because it is started by an intent in     * {@link EmmaInstrumentation#onStart()}. This turns more difficult to use     * other methods like using template classes. This latter method could be     * viable, but all Activity methods should be re-written to invoke the     * template parameter class corresponding methods.     *      * @author diego     *      */    public static class InstrumentedActivity extends    TemperatureConverterActivity {        private FinishListener mListener;        public void setFinishListener(FinishListener listener) {            mListener = listener;        }        @Override        public void finish() {            if (LOGD)                Log.d(TAG + ".InstrumentedActivity", "finish()");            super.finish();            if (mListener != null) {                mListener.onActivityFinished();            }        }    }    /**     * Constructor     */    public EmmaInstrumentation() {    }    @Override    public void onCreate(Bundle arguments) {        if (LOGD)            Log.d(TAG, "onCreate(" + arguments + ")");        super.onCreate(arguments);        if (arguments != null) {            mCoverage = getBooleanArgument(arguments, "coverage");            mCoverageFilePath = arguments.getString("coverageFile");        }        mIntent = new Intent(getTargetContext(), InstrumentedActivity.class);        mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        start();    }    @Override    public void onStart() {        if (LOGD)            Log.d(TAG, "onStart()");        super.onStart();        Looper.prepare();        InstrumentedActivity activity = (InstrumentedActivity) startActivitySync(mIntent);        activity.setFinishListener(this);    }    private boolean getBooleanArgument(Bundle arguments, String tag) {        String tagString = arguments.getString(tag);        return tagString != null && Boolean.parseBoolean(tagString);    }    private void generateCoverageReport() {        if (LOGD)            Log.d(TAG, "generateCoverageReport()");        java.io.File coverageFile = new java.io.File(getCoverageFilePath());        // We may use this if we want to avoid refecltion and we include        // emma.jar        // RT.dumpCoverageData(coverageFile, false, false);        // Use reflection to call emma dump coverage method, to avoid        // always statically compiling against emma jar        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, false, false);        } catch (ClassNotFoundException e) {            reportEmmaError("Is emma jar on classpath?", e);        } catch (SecurityException e) {            reportEmmaError(e);        } catch (NoSuchMethodException e) {            reportEmmaError(e);        } catch (IllegalArgumentException e) {            reportEmmaError(e);        } catch (IllegalAccessException e) {            reportEmmaError(e);        } catch (InvocationTargetException e) {            reportEmmaError(e);        }    }    private String getCoverageFilePath() {        if (mCoverageFilePath == null) {            return DEFAULT_COVERAGE_FILE_PATH;        } else {            return mCoverageFilePath;        }    }    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);        mResults.putString(Instrumentation.REPORT_KEY_STREAMRESULT, "\nError: "                + msg);    }    /* (non-Javadoc)     * @see com.example.instrumentation.FinishListener#onActivityFinished()     */    @Override    public void onActivityFinished() {        if (LOGD)            Log.d(TAG, "onActivityFinished()");        if (mCoverage) {            generateCoverageReport();        }        finish(Activity.RESULT_OK, mResults);    }}


定义finish接口
package com.example.instrumentation;/** * Listen for an Activity to finish and invokes {@link #onActivityFinished()} when this happens. *  * @author diego * */public interface FinishListener {        /**         * Invoked when the Activity finishes.         */        void onActivityFinished();}


修改ant build.xml文件
 <!-- It only instruments class files, not any external libs -->            <emma enabled="true">               <instr verbosity="${verbosity}"                               mode="overwrite"                               instrpath="${out.absolute.dir}/classes"                               outdir="${out.absolute.dir}/classes">                    <!-- DTM: 2011-12-23: added filter for R -->                     <filter excludes="*.R" />                     <filter excludes="*.R$*" />                </instr>                <!-- TODO: exclusion filters on R*.class and allowing custom exclusion from                             user defined file --></emma>


https://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project
http://dtmilano.blogspot.com/search/label/android

更多相关文章

  1. Appium框架解析
  2. TensorFlow for Android(安卓)PB模型的优化
  3. 在Android中让Preference的宽度占满整个屏幕的宽度
  4. 2012.08.24(2)——— android ffmpeg.so 测试
  5. 如何在Android(安卓)NDK中调用第三方库文件(.so)
  6. Android代码实现WiFi连接
  7. android中生成keystore
  8. NDK HOWTO
  9. Android(安卓)Studio将本地计算机文件上传到模拟器scard文件中

随机推荐

  1. 浅谈android的selector背景选择器
  2. Android直播开发之旅(9):OkCamera,Android(
  3. android 抗锯齿效果
  4. Android(安卓)移植到 C#
  5. unity在android真机上的调试
  6. 论Android(安卓)Binder驱动在Framework中
  7. Android处理大图片
  8. Android(安卓)Animation学习笔记
  9. android vsnc 工作原理
  10. Android(安卓)NDK: Host 'awk' tool is o