第二步
定义一个JacocoHelper类,主要是用来生成ec文件,根据使用场景可以放在你需要的地方,比如在APP内提供一个按钮,点击触发生成ec文件,也可以通过命令行的方式触发,具体代码如下:
droid.jarvis.jacoco; 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 JacocoHelper { private static final String TAG = "JacocoHelper"; //ec文件的路径 private static final String DEFAULT_COVERAGE_FILE_PATH = Environment.getExternalStorageDirectory() .getPath() + "/coverage.ec"; /** * 生成ec文件 * * @param isNew 是否重新创建ec文件 */ public static void generateEcFile(boolean isNew) { OutputStream out = null; File mCoverageFilePath = new File(DEFAULT_COVERAGE_FILE_PATH); try { if (isNew && mCoverageFilePath.exists()) { Log.d(TAG, "清除旧的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); if (agent != null) { out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class) .invoke(agent, false)); } } catch (Exception e) { Log.d(TAG, e.toString()); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); }
在需要生成ec文件的地方调用下面的方法:
JacocoHelper.generateEcFile(true);
生成测试报告
通过上面的两个步骤,我们就完成了Android项目的Jacoco配置,下面再教大家如何使用它来获取我们手工或者自动化测试的代码覆盖率。
首先我们可以通过Android Studio直接编译安装集成了Jacoco的Debug包,然后再在项目的根目录执行下面的命令完成初始化:
./gradlew jacocoInit
接着我们就可以通过执行自动化测试脚本或者手工来开始我们的用例测试了,测试完成后执行下面的命令:
adb pull /storage/emulated/0/coverage.ec .
把得到的coverage.ec文件放到下图所示的位置,其中code-coverage目录就是执行初始化脚本生成的。
最后我们在项目根目录执行下面的命令来生成报告:
./gradlew jacocoTestReport
在下图所示位置,我们就可以看到覆盖率的报告了
注意:
上面的命令中用的是./gradlew,但也可以替换为gradle,两者的区别这里跟大家稍微解释一下,gradlew其实就是对gradle的包装和配置,gradlew是gradle Wrapper,Wrapper的意思就是包装。
因为不是每个人的电脑中都安装了gradle,也不一定安装的版本就是要编译项目需要的版本,那么gradlew里面就配置了项目需要的gradle版本,用户只需要运行gradlew就可以按照配置下载对应的gradle到项目的目录中,仅仅给项目本身用。
报告分析
生成的报告如下:
点击包名你可以看到类的覆盖率情况
再点击类名,可以看到具体哪些代码被调用到了,又有哪些代码没有被调用到
落地场景
我们既然可以根据执行的用例拿到代码的覆盖情况,那么我们就可以基于这个数据来做度量和精准测试了,比如:
1、可以让业务QA或者外包使用覆盖率包来完成功能模块的测试工作,这样就可以根据生成的覆盖率数据来度量测试效果了;
2、另外在做精准测试的时候,我们都需要维护用例和代码的关系库,那么如何得到这个关系呢,这时候我们就可以通过在手工或者UI自动化的方式执行用例的过程中把每个用例跟对应覆盖的代码类文件建立映射关系来完成初期的关系库;