欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

浅析gradle(android)如何一行配置支持代码覆盖测试(jacoco)

程序员文章站 2022-03-09 22:36:15
这行配置就是 testcoverageenabled true 我在前一篇文章中,花了不少时间把gradle的包装去掉,但是真的落地用的时候。发现pitest、cobertura都没有jacoco这...

这行配置就是

testcoverageenabled true

我在前一篇文章中,花了不少时间把gradle的包装去掉,但是真的落地用的时候。发现pitest、cobertura都没有jacoco这么简单的集成&&完整的支持,完整的支持 看起来是一个可以研究的点。

有一篇博客 how to get code coverage during manual testing for android app(下文用 manualjacoco 指代它),里面提到一种方法,就是编译后手动点,在手机上把执行的信息存到文件中,然后再拉回gradle编译出报告。细节方法看连接里的文章吧。好奇gradle到底做了什么?

正文

根据 manualjacoco 做了一波之后,脚本执行的有几行指令

# step 1
# build && apply jacoco offline instrument %% generate apk
./gradlew assembdebug && \
adb install app/build/outputs/apk/debug/app-debug.apk

# step 2
# do manual ui test in android‘phone ,and dump exec message into file

# step 3
# pull exec info ,according local code generate html report
./gradlew connectedandroidtest && \
adb pull /sdcard/coverage.exec app/build/outputs/code-coverage/connected/coverage.exe && \ 
./gradlew jacocotestreport

先打开debug开关,然后从日志来分析

./gradlew assembdebug -d

说几个关键信息

1,用到org.gradle.testing.jacoco.plugins.jacocopluginextension 这个插件
2,配置之后,用到了这里的配置

…/android/sdk/extras/m2repository/org/jacoco/org.jacoco.agent/0.7.9/org.jacoco.agent-0.7.9.pom
…/android/sdk/extras/android/m2repository/org/jacoco/org.jacoco.agent/0.7.9/org.jacoco.agent-0.7.9.pom
…/android/sdk/extras/google/m2repository/org/jacoco/org.jacoco.agent/0.7.9/org.jacoco.agent-0.7.9.pom

3,jacoco的几个jar包好像有被打进dex中,包括

org.jacoco.agent-runtime.jar
org.jacoco.report.jar
org.jacoco.core.jar
org.jacoco.agent.jar
org.jacoco.ant.jar

用as的工具分析下,as -> build -> analyze apk…

浅析gradle(android)如何一行配置支持代码覆盖测试(jacoco)

确实是有把jacoco的代码打进dex包中,所以这里就不用担心分包的问题了。但是很迷的是,因为没有显性的引用,写代码的时候,引用import org.jacoco.agent.rt.rt 会报错,导致这里只能用反射去拿jacoco才能dump执行信息到文件。

所以有几个点:

有没有办法不用反射就能拿到jacoco?或者是只能通过反射调用,有什么好处?

当然是可以有的。但是不这样做,应该是考虑到这个是一个优化功能。正式版本都不会用到。所以做成反射去用是最好的。

jacocopluginextension到底做了什么

直接看代码

// todo
// to be write