测试覆盖率 覆盖率打包与 CI/CD 如何更无侵入的结合

eryi · 2021年05月12日 · 最后由 eryi 回复于 2021年05月27日 · 3305 次阅读

这两天刚刚开始研究覆盖率,可能有错误请指正。

现状调研

插桩模式

除了 java 有 agent 这种运行时插桩的方式以外,大多数语言的覆盖率是需要在编译期打进去的,例如 gcc,或者 go 的 test coverage

具体方式

那么对于编译期进行打包的话,像 jacoco 需要在 maven 的 pom 文件里面增加 plugin 或者 ant 的 build 文件里面添加一些关于覆盖率的插件,c/c++/go 这些则是在编译命令后面添加一些指令,编译器在编译时就完成了覆盖率相关的工作。而 java 添加插件的方式也可以在 mvn 的命令里面动态的添加进来,例如

mvn clean install xx.jar -Dfile = <文件路径> -DgroupId = <组ID> -DartifactId = <文物ID> -Dversion = <版本> -Dpackaging = <包装> 

现状总结

大多数语言的编译期覆盖率打包,都要在编译命令中添加一些覆盖率相关的指令实现覆盖率打包

如何与 CI/CD 结合

如何让用户不用在自己的项目内去配置覆盖率相关的内容,而通过流水线上的一个插件,无侵入的实现自动覆盖率打包。

实现思路

去解析不同语言、不同插件的编译命令,然后在适当的位置插入我们的覆盖率打包指令实现一套通用的覆盖率打包方案。

是否有更好的实现方案?

共收到 4 条回复 时间 点赞

如果是流水线的插件的话,那原有流水线的编译和这个增加覆盖率的编译,可能会引起重复。

建议是直接扩展现有流水线上的编译插件或函数,直接增加是否内置覆盖率统计的开关。至于开关打开后具体插入什么参数,那就根据具体语言和编译器来进行对应设定了。不过一般不同语言整个流水线各个步骤都会有差异,一般 devops 平台都会直接用项目类型来直接区分语言的吧。

eryi #2 · 2021年05月12日 Author
陈恒捷 回复

是的,这里最好是要编译组件提供一个关于编译命令的切面出来,让覆盖率组件去修改原始编译命令来实现。
再或者 我们可以创建一个覆盖率构建组件,去调用原本的编译组件都可以。
这个实现方案的难点在于需要根据不同的语言、编译器、构建系统的命令,解析 shell,将原始指令修改成覆盖率打包需要的指令,所以不知道业界是否有其他无侵入的方案

我记得以前用某云测服务的时候,他们也提供覆盖率分析,但是我们提交的是 apk 而非源码,可能是有方案的吧,不过具体原理不清楚。

至于 “如何让用户不用在自己的项目内去配置覆盖率相关的内容”,我觉得直接把.pipeline 文件拿到项目仓库外管理就可以实现了……如果是 gitlab-ci.yml 那就逃不过了~~~

不过我不认可开发者不自己处理 ci/cd 的行为,都交给测试或者 devops 工程师,本质上就是甩手掌柜!

eryi #4 · 2021年05月27日 Author
槽神 回复

有了点新的研究成果回来回复一下,apk 可以直接打覆盖率是因为 android 内置了 emma 的包,这样只需要对 apk 进行 offline overwrite 模式的覆盖率打包,就可以直接跑起来

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册