`
MyEyeOfJava
  • 浏览: 1151358 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:71140
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

[android]android自动化测试十一之代码覆盖率报告EMMA

阅读更多
以下代码时监听测试程序结束后将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
分享到:
评论

相关推荐

    Emma进行代码覆盖率检查(命令行方式)

    在 Offline 模式下使用 Emma 进行代码覆盖率检查需要经过三个步骤:插桩、运行测试、合并覆盖率统计数据和输出统计报告。 插桩是 Emma 的第一个步骤,使用 instr 命令对 class 文件或文件夹进行插桩。插桩的目的是...

    软件测试中的自动化测试与代码覆盖率.pptx

    ### 软件测试中的自动化测试与代码覆盖率 #### 第一章:软件测试中的自动化测试与代码覆盖率 **自动化测试**是指使用特定的工具或脚本来执行预定义的测试用例,以验证软件产品的功能是否符合预期的行为。这种方式...

    emma代码覆盖率

    用户代码覆盖率测试 ,开源可重写,对于产品质量控制非常重要

    [转]EMMA测试代码覆盖率的脚本

    EMMA是一个开源的Java代码覆盖率工具,它可以帮助开发者了解在自动化测试中哪些代码被执行过,哪些没有被执行,从而提高测试的质量和覆盖率。 在描述中提到的“博文链接:https://laorer.iteye.com/blog/123893”,...

    emma单元测试覆盖率

    EMMA,全称为Emma Metrics for Java,是一款开源的代码覆盖率工具,专为Java应用程序提供精确的测试覆盖率报告。 EMMA的核心功能在于收集和分析执行单元测试后的代码覆盖数据,包括行覆盖率、分支覆盖率、方法覆盖...

    基于Emma的独立测试用例代码覆盖率统计

    本文主要探讨了如何在实际Java项目中使用EMMA进行代码覆盖率统计,强调了功能测试中类覆盖率和方法覆盖率的重要性,并介绍了EMMA在环境准备、工具配置、测试执行和覆盖率报告方面的具体应用方法。 EMMA是一款专门...

    代码覆盖率驱动的测试资料.docx

    本文主要探讨了如何利用代码覆盖率工具EMMA来进行测试,并详细介绍了在Android工程中使用EMMA进行单元测试覆盖率检查的步骤。 EMMA是一个开源的Java程序测试覆盖率工具,它通过字节码插装技术在运行时收集覆盖率...

    Emma_for_Android

    ### 使用Emma进行Android程序代码覆盖率测试 #### 一、引言 在软件开发过程中,确保代码的质量至关重要。其中,代码覆盖率是一种衡量测试充分性的指标,它可以帮助开发者了解哪些部分的代码已被测试覆盖,哪些部分...

    emma java统计代码覆盖率

    Emma 是一款开源的 Java 代码覆盖率工具,专为评估和报告 Java 代码的测试覆盖率而设计。它适用于各种规模的项目,从小型项目到大型企业级应用,都能提供准确的覆盖率数据。Emma 提供了多种级别的覆盖率指标,包括包...

    emma统计手工测试或Ui测试覆盖率——几个工具文件

    描述中的链接指向了一篇CSDN博客文章,虽然具体内容无法在当前环境下访问,但通常这类文章会详细解释如何使用Emma来统计手工测试(可能是指非自动化测试)或UI测试(用户界面测试)的覆盖率。UI测试主要关注软件的...

    Junit代码覆盖与自动化测试

    JUnit不仅是一个强大的单元测试工具,也是实现自动化测试和提高代码覆盖率的关键。通过合理地编写单元测试用例,并利用JaCoCo等工具进行代码覆盖分析,可以显著提高软件产品的稳定性和可靠性。此外,持续集成的实践...

    基于emma的测试覆盖率分析工具,swing界面操作

    通过Swing,Emma提供了一个图形化的用户界面,用户可以通过这个界面来配置参数,启动测试,查看覆盖率报告等。这种可视化操作使得非技术背景的用户也能相对容易地理解和使用Emma。 **对WAR包的插桩** 插桩...

    代码覆盖率eclipse插件和ant插件

    `emma_ant.jar`允许开发者在Ant脚本中添加Emma任务,以便在构建过程中自动计算代码覆盖率,这样可以在整个项目生命周期中持续监控代码覆盖率,而不是只在测试阶段进行检查。 使用EclEmma,开发者可以直观地看到代码...

    emma.jar emma_ant.jar emma_device.jar

    Ant是一个广泛使用的Java构建工具,通过在Ant构建文件中添加EMMA的任务,开发者可以在自动化构建和测试流程中轻松地插入代码覆盖率检查。这有助于确保每次构建时都进行覆盖率检查,并及时发现未充分测试的代码。 `...

    一种Java代码覆盖率工具的应用研究.zip

    6. **覆盖率与持续集成**:在持续集成环境中,每次提交都会触发自动化构建和测试,同时计算代码覆盖率。这样可以及时发现覆盖率下降,促使团队保持良好的测试实践。 7. **挑战与改进**:尽管代码覆盖率工具提供了有...

Global site tag (gtag.js) - Google Analytics