移动测试基础 Android 手工测试代码覆盖率增强版

花开 · 2016年07月21日 · 最后由 会说话的汤姆猫 回复于 2016年08月15日 · 1838 次阅读

AndroidEmma

项目参考 TestHome 里面手工测试代码覆盖率手工版,只为提供一种方便大家调用的工具,和当前项目无侵入。

参考信息

# 使用方法

  • 在 app/src 目录下面建立 debug 目录,AndroidManifest.xml 文件信息如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="替换成自己的包名">

    <instrumentation
        android:handleProfiling="true"
        android:label="CoverageInstrumentation"
        android:name="me.shenfan.androidemma.EmmaInstrumentation"
        android:targetPackage="替换成自己的包名"/>

</manifest>

在 app 下面的 build.gradle 中添加

apply plugin: 'jacoco'
jacoco{
    toolVersion = "0.7.1.201405082137"
}

android{
    buildTypes {
        debug {
            testCoverageEnabled = true
        }   
    }
}

dump 覆盖率文件的俩种方式:

  • 一: 主界面的Activity实现接口 EmmaInstrumentationListener, 添加如下方法,会在程序退出的时候 dump 测试覆盖率

private FinishListener finishListener;

@Override
public void setFinishListener(FinishListener listener) {
    finishListener = listener;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (finishListener != null){
        finishListener.onActivityFinished();
    }
}

  • 二: 在需要的时候调用下面方法
EmmaUtil.dump(Context);

更多信息见 demo 项目

开始手工测试

打开桌面图标 EmmaInstrumentation ,点击 open 即可,其实就是执行了

adb shell am instrument 当前应用包名/me.shenfan.androidemma.EmmaInstrumentation

覆盖率结果查看

默认数据保存在 sdcard/Android/当前项目包名/coverage.ec

根据 coverage.ec 生成报告,请看这里

Gradle


allprojects {
    repositories {
        maven { url "https://www.jitpack.io" }
    }
}

dependencies {
    debugCompile  'com.github.yaming116.AndroidEmma:library:1.1.0'
    releaseCompile 'com.github.yaming116.AndroidEmma:androidemma-no-op:1.1.0'
}

项目地址: github

共收到 14 条回复 时间 点赞

adb shell am instrument 当前应用包名/me.shenfan.androidemma.EmmaInstrumentation 你这手工测试测的是啥?请问

具体信息在这里,https://testerhome.com/wiki/androidcodecoveragebydockerq,这边提供一种方便集成的方案

其实还是不错的。只是既然是一种方案,建议帖子里更多地从用户角度介绍如何集成到项目中,如何生成报告,如何获取报告。现在的内容对于这方面的说明略少,虽然可以通过查看你的 demo 项目了解,但光看帖子有点让人搞不清这个具体要怎么用。

另外,主界面实现方法那里:

// 二是调用 
EmmaUtil.dump(Context);

这个建议不要写在这段代码中,要不搞不懂这行代码应该是一起加上去还是另外使用。

#3 楼 @chenhengjie123 稍稍修改了一下,集成项目的流程现在应该清楚了吧?把生成报告的也添加进去了

你的这个方案无法真正落地到手工测试业务,脱机启动的问题、代码侵入的问题、覆盖率收集丢失情况的考虑 解决以上三点才有可能真正落地,建议深入了解下 jacoco 的原理,怎样改造才能解决以上三个问题。

#6 楼 @vigossjjj 脱机启动的问题、代码侵入的问题、覆盖率收集丢失,就是因为这三个问题,我们没做覆盖率,而是采用了代码流埋点来做业务覆盖率。。

#6 楼 @vigossjjj 第一个:脱机启动是不存在问题的,我上面说到会有一个应用的,点击里面可以直接打开测试,第二个代码入侵,这边提供了两个版本,一个是 debug,一个是 release 的,我认为代码入侵也不是问题,测试数据丢失,是怎么丢失的?
#7 楼 @lihuazhang

#8 楼 @yaming116 我用你的 dome 跑了下直接报错了 08-08 10:12:37.991 29079-29079/me.shenfan.androidemma.sample E/test: am instrument me.shenfan.androidemma.sample/me.shenfan.androidemma.EmmaInstrumentation
08-08 10:12:38.055 29079-29079/me.shenfan.androidemma.sample W/System.err: java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
08-08 10:12:38.055 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.ProcessManager.exec(ProcessManager.java:211)
08-08 10:12:38.055 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.Runtime.exec(Runtime.java:174)
08-08 10:12:38.055 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.Runtime.exec(Runtime.java:247)
08-08 10:12:38.055 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.Runtime.exec(Runtime.java:190)
08-08 10:12:38.055 29079-29079/me.shenfan.androidemma.sample W/System.err: at me.shenfan.androidemma.OpenJacocoInstrumtationActivity.adbCommand(OpenJacocoInstrumtationActivity.java:41)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at me.shenfan.androidemma.OpenJacocoInstrumtationActivity.open(OpenJacocoInstrumtationActivity.java:28)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.reflect.Method.invoke(Native Method)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at android.view.View.performClick(View.java:5265)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at android.view.View$PerformClick.run(View.java:21527)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at android.os.Handler.handleCallback(Handler.java:815)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at android.os.Handler.dispatchMessage(Handler.java:104)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at android.os.Looper.loop(Looper.java:207)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5792)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.reflect.Method.invoke(Native Method)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:910)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: Caused by: java.io.IOException: Permission denied
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.ProcessManager.exec(Native Method)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: at java.lang.ProcessManager.exec(ProcessManager.java:209)
08-08 10:12:38.056 29079-29079/me.shenfan.androidemma.sample W/System.err: ... 16 more

老司机 你 QQ 多少

花开 #11 · 2016年08月11日 Author

#10 楼 @huchao2307 应该是权限的问题,我当时的测试设备是 root 过的,忘记这点了,不好意思,我可能要试试一些别的方法执行 am instrument 这个命令了

花开 #12 · 2016年08月15日 Author

#12 楼 @huchao2307 已经更新你,你试试

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册