`
hsabby
  • 浏览: 20994 次
社区版块
存档分类
最新评论
  • Rainyn: 作者写的很好。有完整项目实例吗?这个是跑在tomcat还是je ...
    初识cometd
  • hwfrog: 这个没有看过具体的源码,猜测的,因为init是所有用户进程的父 ...
    inittab的使用
  • hwfrog: 确实简单,这个感觉和RCP很类似,RMI在某些地方还是有一定的 ...
    Java的RMI初探
  • hwfrog: 不错, 学习了; 这段时间也想研究一下源码, 多交流
    初识cometd
  • hwfrog: 后面准备总结一下java的接口和内部类; 请博主多关注哈
    Java访问修饰符

基于安卓的功能测试覆盖率统计

 
阅读更多

<!--defaultCSS-->

 
几个基本概念:
1、什么是Instrumentation
Instrumentation,类似于Activity,是安卓的一个专属概念;我们把它看做一个专门用于监控其他类的工具类。它具有启动其他类的能力
 
2、什么是Emma?
emma是一个测试代码覆盖率的工具,可以在执行测试后获取测试代码的覆盖率。它的基本原理是通过对编译后的class文件进行插装,在执行测试的同时,向内存中写入覆盖率信息,等测试执行完后,从内存中获取覆盖率信息并生成报表。
 
执行的步骤:
1、实现功能代码
 
2、编写测试插装代码
    我们会实现从一个继承自Instrumentation的类EmmaInstrumentation,来管理我们要测试的程序。它接管了我们程序的启动和停止,并且在程序推出的时候,把emma生成在内存中的覆盖率信息输出到文件中。
   基本代码框架如下:
 
//从Instrumentation派生,并且实现FinishListener接口,该接口用于监听真正Activity的停止,输出覆盖率文件
public class EmmaInstrumentation extends Instrumentation implements FinishListener
 
//启动的时候,创建的是包装后的activity,而不是原有的activity
public void onCreate(Bundle arguments) {
        super.onCreate(arguments);
        mIntent = new Intent(getTargetContext(), InstrumentedActivity.class);
        mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        start();
    }
//启动程序
public void onStart() {
        super.onStart();
        Looper.prepare();
        InstrumentedActivity activity = (InstrumentedActivity) startActivitySync(mIntent);
        activity.setFinishListener(this);
    }
//在结束的时候,生成报告
    @Override
    public void onActivityFinished() {
        generateCoverageReport();
        finish(Activity.RESULT_OKmResults);
    }
//报告的生成
Class<?> emmaRTClass = Class.forName("com.vladium.emma.rt.RT");
            Method dumpCoverageMethod = emmaRTClass.getMethod(
                    "dumpCoverageData", coverageFile.getClass(), boolean.class,
                    boolean.class);
            dumpCoverageMethod.invoke(null, coverageFile, falsefalse);
 
//包装测试类的实现,目的是不修改程序的功能代码添加监听程序结束的功能
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();
            }
        }
    }
 
3、配置工程
    插装的代码编写完了之后,我们要AndroidManifest.xml文件中配置上相应的数据
  //允许写文件
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
 <instrumentation android:name="com.example.instrumentation.EmmaInstrumentation" android:targetPackage="com.example.i2at.tc"></instrumentation>  (补充:这里的target只需要填写和AndroidMainifest.xml中定义的package一样就可以了;和具体代码的package没有关系,工程下代码的的覆盖率都会被统计出来)
 <activity android:name="com.example.instrumentation.EmmaInstrumentation$InstrumentedActivity"></activity>
 
4、打包、安装
ant clean、ant instrument、 ant installi通过这三个命令完成打包和安装的过程
 
5、运行、测试
D:\development\adt\sdk\platform-tools>adb.exe shell am instrument -e coverage tr
ue -w com.example.i2at.tc/com.example.instrumentation.EmmaInstrumentation
INSTRUMENTATION_CODE: -1
执行上述命令运行程序,程序启动后,按照操作测试程序,测试完后,程序正常退出,此时,会生成覆盖率的文件在/mnt/sdcard下
执行 adb.exe pull /mnt/sdcard/coverage.ec获取文件到本地
 
6、生成覆盖率文件
java -cp D:\development\adt\sdk\tools\lib\emma.jar emma report -r html -in coverage.em,coverage.ec -Dreport.html.out.file=coverage.html -Dreport.metrics=class:80 
执行上述命令生成覆盖率文件,其中coverage.ec是我们执行完测试后生成的文件,而coverage.em是在插装时生成的元数据文件。报告的输出为coverage.html,我们可以从该文件中看出测试代码的覆盖率
 
问题:为什么在输出覆盖率文件的时候会提示没有权限?但是在AndroidManifest.xml文件中已经配置了写权限
回答:如果我们使用的是模拟器的话,则必须要配置模拟的SD Card的size参数,否则,就会报没有权限的错误。
 
 
 
分享到:
评论

相关推荐

    Android Native C++代码覆盖率统计 Demo(基于NDK 21)

    本Demo主要介绍如何在Android环境中使用NDK 21来实现对C++代码的覆盖率统计。下面我们将深入探讨这个主题。 首先,代码覆盖率是衡量软件测试完整性的一个重要指标,它反映了测试用例执行时覆盖了多少源代码。对于...

    android工程JaCoCo代码覆盖率Demo

    为了提高测试覆盖率,你需要编写充分的单元测试和集成测试,确保覆盖到各种可能的业务逻辑路径。在Android工程中,可以使用JUnit、Mockito等库进行测试,同时使用Espresso进行UI自动化测试。 总之,JaCoCo对于理解...

    基于行为树模型的Android应用GUI自动随机测试方法.pdf

    该模型在Android应用GUI测试中的应用可以提高测试的覆盖率和准确性。 ### 用户使用日志(User Usage Logs) 用户使用日志记录了用户对应用的实际操作信息,包括用户点击、滑动等操作。通过分析用户使用日志,可以...

    基于Android平台的微记账APP.zip

    利用Android Studio的测试工具,如 Espresso 和 JUnit,编写自动化测试脚本,提高测试覆盖率。 通过以上这些技术和方法,开发者可以构建出一个功能齐全、用户体验良好的微记账APP。同时,课程设计报告论文则会详细...

    基于Android的学生宿舍管理系统的实现.doc

    完成开发后,进行功能测试、性能测试以及用户体验测试,对发现的问题进行修复和优化,确保系统的稳定运行。 六、结论 基于Android的学生宿舍管理系统以其便捷的操作和高效管理,展示了移动信息化在校园管理中的...

    web版本自动化测试报告

    5. 报告生成:生成详细的测试报告,包括测试覆盖率、失败率、问题追踪等信息。 四、自动化测试报告内容 1. 测试环境:操作系统、浏览器版本、测试工具和框架等。 2. 测试范围:涵盖的功能模块、测试用例数量。 3. ...

    APP软件业务测试报告模板

    测试总结部分是对整个测试过程的概述,包括测试覆盖范围、测试环境、执行情况以及测试结果的关键指标。例如,测试在"XXXX 测试机"的"XXXX 环境"下进行,共执行了XX个有效案例,执行率为XX%,成功率XX%。这一部分强调...

    Android系统服务漏洞挖掘技术研究.pdf

    【Android系统服务漏洞挖掘技术研究】 在Android操作系统中,系统服务是核心组件,它们作为后台运行的系统级进程或...未来的研究可能会进一步优化模糊测试策略,提高测试覆盖率,以及开发更精细的漏洞检测和修复机制。

    VB.net, C#,Java,PHP代码行统计工具

    这有助于估算开发时间、工作量、维护成本以及测试覆盖率。"VB.net, C#,Java,PHP代码行统计工具"就是这样一个实用的工具,它能帮助开发者快速统计指定编程语言的代码行数,并基于这些数据进行更深入的分析。 首先,...

    AndroidEmmaService:艾玛(Emma)报道android服务

    - **Jacoco**: Jacoco是后来取代Emma的现代代码覆盖率工具,它提供了更全面的覆盖率统计,并且与Android Studio更好地集成,但Emma在某些情况下可能更适合老版本的Android项目。 - **Cobertura**: Cobertura也是...

    TCloud云测平台解决方案.pptx

    鉴于TCloud云测平台已经实现了对多平台、多项目的支持,以及高效的自动化测试和流程控制,其未来的发展可能包括增强设备资源的智能化调度,提升测试覆盖率,加强数据分析能力,优化用户体验,以及进一步整合更多的...

    android家庭财务管理-开题报告

    论文研究任务的时间安排包括了Android开发环境的学习、需求分析、功能设计、软件编写和测试等阶段,覆盖了2012年4月至6月的时间段。 整个项目旨在利用Android平台的特性,构建一个适应现代生活节奏的家庭财务管理...

    九号公司测试岗面试题.pdf

    7. **网站测试**:对网站进行全面测试,包括功能测试、兼容性测试、性能测试、安全性测试等。 8. **深刻Bug**:描述一个印象深刻的问题,展示问题识别和解决能力。 9. **无需求文档**:在缺乏明确需求时,可以通过...

    Android考勤系统

    2. 通知推送:集成更多的通知渠道,如微信、短信,提升通知覆盖率。 3. 多语言支持:面向不同国家和地区的学生,提供多语言版本。 4. 家长端应用:开发家长版应用,让家长实时了解孩子的出勤情况。 总结,开发一个...

    初学者入门:软件测试从零开始

    测试用例的设计是确保测试质量的关键步骤之一,合理的测试用例可以覆盖更多的功能点,提高缺陷发现率。 1. **编写测试用例**: - 基于需求文档,设计针对各个功能点的测试案例。 - 包括正常情况下的操作流程和...

    TCloud云测平台解决方案.pdf

    5. **用例管理**:方便创建、维护和执行测试用例,提高测试覆盖率。 6. **资产管理**:有效管理和分配测试设备资源,减少硬件投入。 7. **Dashboard**:提供实时数据展示,帮助决策者了解项目状态和测试效果。 三、...

Global site tag (gtag.js) - Google Analytics