51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 754|回复: 0
打印 上一主题 下一主题

Java 服务端和 Android 端手工测试覆盖率统计的实现(下)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-3 15:25:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 草帽路飞UU 于 2022-8-12 16:44 编辑

五、填坑经历
  截止到此时,坑已经出现了,那肯定要填,于是乎就开始了一系列排查问题过程:
  5.1 首先怀疑的是 toolVersion
  于是乎做了以下尝试
  ·第一步,改版本
  往高了调和往低了调都不行,依然是无法解析。
  · 第二步,把这个版本删除 (设置为空字符串 "")
  我去,覆盖率数据依然能出来,这说明这个 plugin 中设置的这个 toolVersion 对这个 apk 生成的时候不生效啊。
  · 第三步,把那个 testCoverageEnabled 设置成 false
  很好,报错了,ClassNotFound,这就对了,于是乎有了后续的步骤。
  5.2 找移动端开发负责人
  询问这个 Jacoco 的机制,结果跟社区的文章里和网上能查到的大都差不多。
  但是他给了另一个提示:“我们这个 Jacoco 插件当前的运行方式是编译期,而不是运行期”。因为在此之前,我跟他描述了我们的需求,基本确定了我们的生成方式,是运行期而不是编译期,既然是在 APK 的代码里可以用反射查找到,那说明:
  Jacoco 的代码库,确实被打到了 apk 里面。
  5.3 换 AS 版本
  原来用的 181,改成了最新的 193,没有解决。
  5.4. 换 Gradle 版本
  原来我们工程内置的是 4.1 版本,换成了其他版本,有的太高了根本无法构建,有的 4.4 4.6 的基本还是同样的问题。
  5.5. 新思路,查依赖的库
  从 task 里,找到了 dependencies 这个任务,运行了下,发现确实依赖的是 0.7.4.201502262128```java
  
  1. |    +--- project :message
  2.   |    |    +--- org.Jacoco:org.Jacoco.agent:0.7.4.201502262128
  3.   |    |    +--- project :user (*)
  4.   |    |    \--- project :coreLibrary (*)
  5.   |    +--- project :highlights
  6.   |    |    +--- org.Jacoco:org.Jacoco.agent:0.7.4.201502262128
  7.   |    |    +--- project :user (*)
  8.   |    |    +--- project :comment (*)
  9.   |    |    \--- project :coreLibrary (*)
  10.   |    +--- project :search
  11.   |    |    +--- org.Jacoco:org.Jacoco.agent:0.7.4.201502262128
  12.   ```
复制代码

而且解析 apk,发现确实 apk 里面集成的也是这个版本,如图所示:

更加确定了这个版本,其实目前来说没有受我们当前代码的控制, 继续从 build.gradle,找到其他依赖的库,挨个查看,主要找的是根目录下面的依赖。
  在找了数十个依赖都无果之后,让我发现了这个库:
   classpath 'com.android.tools.build:gradle:3.0.1
 我们的代码当前引的是 3.0.1 版本,于是乎在 Maven 中央仓库中去找了下看看,地址如下:
  https://mvnrepository.com/artifa ... .build/gradle/3.0.1
  它引用了一个编译期依赖: com.android.tools.build:gradle-core:3.0.1,地址如下:
  https://mvnrepository.com/artifa ... d/gradle-core/3.0.1
  如下图所示:

哇哦,发现了新大陆,它里面引用了 Jacoco 的库,也确实是 0.7.4.201502262128 版本,后面的事情就没有任何选择滴开始了,升级这个版本!!!!
  六、升级版本做了什么
  可全局查找该属性所在位置,本例中,在项目工程下的 build.gradle 声明 , 修改后如下:
  1. 修改 com.android.tools.build:gradle 版本
 dependencies {
          classpath 'com.android.tools.build:gradle:3.2.1'
          ...
      }
· 原 compile 指令换成 API
  · 原 testCompile 指令换成 testImplementation
  · 原 provided 指令换成 compileOnly
  · 原 instrumentTest 换成 androidTest
  · 在 gradle.properties 文件增加两个属性
 android.enableD8.desugaring=true
  android.useDexArchive=true
当然,还可能有其他需要适配的地方,这就跟项目有关了,改到这个地方,我的问题已经基本解决了。
  七、最后的分析
  按照上述的解决问题分析,最终顺利生成了报告。
  总结了下,其实在这个过程中,我们需要做的地方,最重要的也就是在 debug 版本里打开testCoverageEnabled 这个开关,剩余的事情,其实根生成报告的方式有关了,如果按照 API 来生成报告,理论上来说,关于 Jacoco 的其他地方,都不需要改动。
  1. Gradle 的这个 Jacoco plugin
  肯定是要 apply 这个插件的,这是前提。
  2. testCoverageEnabled
  这个属性,在 debug 版本里,要设置为 true,不然会无法生成。
  3. Jacoco 的 toolVersion
  这个版本号的设置,其实只影响用 task 来生成 Jacoco 的报告,以及在编译期运行单元测试的时候生效,在你打完 debug 包进入 apk 之后,其实它就不生效了。
  4. 关于对 Jacoco 的配置
  在 build.gradle 中对 Jacoco 的配置,其实只是针对 Jacoco 做了任务的扩展,可以让你改变 Jacoco 插件对 Jacoco 库引用的一些默认配置。
  比如生成报告的时候引用的 Jacoco agent 和 Jacoco Ant ,以及扩展一些其他生成报告的任务,可以修改 class 的文件夹属性和 src 属性以及 exec 文件的路径(这里理解的比较浅,可能会有误解,还请大家仔细研究)。
  5. APK 运行期间生成 exec 数据
  划个重点:因为我们是对 API 的运行期做的覆盖率数据统计,所以主管这个 Jacoco 数据生成的,其实控制在下面这个库里。
 classpath 'com.android.tools.build:gradle:3.2.1'
这么看来,之前参考资料里面介绍的如此顺利,也恰好是因为他们用的这个构建版本刚好是支持 0.7.5 以上的 Jacoco core,这好像在 3.1.4(获取还有再低点的,我没仔细看) 以后就支持了,我选择的 3.2.1 内置的好像是 0.7.9+ 的。
  八、覆盖率平
其实不能算是平台,只能说是内部用的一个小工具,有点丑,整体界面如下:


覆盖率统计列表界面:

覆盖率信息配置界面:

最后感谢在摸索的过程中,参考了很多有价值的文章,感谢指引,也欢迎大家一起探讨。
















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-19 16:23 , Processed in 0.060259 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表