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. 生产覆盖率报告的方式跟上篇一样