zoukankan      html  css  js  c++  java
  • Android自动化测试探索(七)代码覆盖率统计

    之前在 https://www.cnblogs.com/zhouxihi/p/11453738.html 这篇写了一种统计Android覆盖率的方式

    但是对于一些比较复杂或者代码结构不够规范的项目,有可能会出现统计不全的问题

    这里记录下另外一种统计覆盖率的方法

    之前提到的方式大致流程是: 启动APP -> 执行测试 -> 返回桌面 -> 生产覆盖率文件

    今天要讲的方式大致流程是: 启动APP -> 执行测试 -> 发送adb请求 -> 生产覆盖率文件

    具体步骤:

    1. 在主activity的onCreate方法后面加上一段启动代码

    override fun onCreate() {
            ..........
            ..........
            // 代码覆盖率统计
            Toast.makeText(this, "代码覆盖率数据统计开始", Toast.LENGTH_SHORT).show()
            val finishReceiver = FinishReceiver()
            val filter = IntentFilter()
            filter.addAction("com.kevin.testool.coverage.finish")
            registerReceiver(finishReceiver, filter)        
    }

    2. 在主activity中添加一个广播接收器

    inner class FinishReceiver : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                JacocoUtils.generateEcFile(intent.getBooleanExtra("IS_NEW", false))
    
            }
    
        }

    3. 在主activity添加相关依赖(可能有漏,检查一下没有报错就行)

    import android.content.BroadcastReceiver
    import android.content.Context
    import android.content.Intent
    import android.content.IntentFilter
    import android.os.Build
    import android.os.Bundle

    4. 在app>src>main>java>com.xxxxxx工程目录下新建一个名为codecoverage的目录,其中放一个JacocoUtils.java

    代码如下:

    package com.xxxxx.xxxxxx.codecoverage;
    
    
    import android.os.Environment;
    import android.util.Log;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    
    public class JacocoUtils {
        static String TAG = "JacocoUtils";
    
        //ec文件的路径
        private static String DEFAULT_COVERAGE_FILE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "coverage.ec";
    
        /**
         * 生成ec文件
         *
         * @param isNew 是否重新创建ec文件
         */
        public static void generateEcFile(boolean isNew) {
    //        String DEFAULT_COVERAGE_FILE_PATH = NLog.getContext().getFilesDir().getPath().toString() + "/coverage.ec";
            Log.d(TAG, "生成覆盖率文件: " + DEFAULT_COVERAGE_FILE_PATH);
            OutputStream out = null;
            File mCoverageFilePath = new File(DEFAULT_COVERAGE_FILE_PATH);
            try {
                if (isNew && mCoverageFilePath.exists()) {
                    Log.d(TAG, "JacocoUtils_generateEcFile: 清除旧的ec文件");
                    mCoverageFilePath.delete();
                }
                if (!mCoverageFilePath.exists()) {
                    mCoverageFilePath.createNewFile();
                }
                out = new FileOutputStream(mCoverageFilePath.getPath(), true);
    
                Object agent = Class.forName("org.jacoco.agent.rt.RT")
                        .getMethod("getAgent")
                        .invoke(null);
    
                out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class)
                        .invoke(agent, false));
    
            } catch (Exception e) {
                Log.e(TAG, "generateEcFile: " + e.getMessage());
            } finally {
                if (out == null)
                    return;
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    4. 修改build grade

    参考这里配置就行: https://www.cnblogs.com/zhouxihi/p/11453738.html

    5. 打包apk

    6.安装测试, 测试中途不要杀掉app, 测试完使用adb下发命令出发生成覆盖率数据

    adb shell am broadcast -a com.kevin.testool.coverage.finish

    如果是统计自动化测试覆盖率,可以在每次杀掉进程前执行一次adb命令等待几秒

    7. 生产覆盖率报告的方式跟上篇一样

  • 相关阅读:
    JSP原理
    基于Servlet+JSP+JavaBean开发模式的用户登录注册
    Eclipse-Java EE
    Javaweb经典三层架构的演变
    Tomcat9 访问 Manager App
    Tomcat 访问 Manager App,Host Manager
    phantomjs 抓取房产信息
    phantomjs 无法打开https网站解决方案
    java HashMap,LinkedHashMap,TreeMap应用
    tomcat 部署 RESTful 服务实例
  • 原文地址:https://www.cnblogs.com/zhouxihi/p/11995593.html
Copyright © 2011-2022 走看看