背景
随着业务的迅速发展,业务代码逻辑的复杂度增加。QA测试的质量对于产品上线后的稳定性更加重要。一般QA测试的工作流程分为两大项:自动化测试和人工测试。这两种测试后都需要得到代码覆盖率。自动化测试的覆盖率,在双端都有比较成熟的方案。
本文着重介绍人工测试过程中,怎么得到对应的代码覆盖率。涉及到的技术主要是代码染色。以下会先介绍整体的工作流程,再对涉及到的技术一一阐述。
染色流程
流程图中涉及到了双端的关键节点以及技术点。我们重点介绍编译阶段。
编译阶段:生成染色包 (对IR文件插桩)
需要在编译中增加编译选项,编译后会为每个可执行文件生成对应的 .gcno文件。
运行阶段:生成二进制覆盖率文件。
在测试代码中调用覆盖率分发函数,会生成对应的 .gcda文件。
解析阶段:将二进制覆盖率文件可视化。
编译阶段
在上文可以看出,编译阶段最核心的操作是对IR文件进行插桩。
什么是IR文件?插桩逻辑是什么?我们往下看。
语言处理系统
一个完整的语言处理系统中,从源程序到可执行的机器代码,如下图所示,历经几个重要模块。而我们上文提到的IR文件,是编译器模块中的产物,插桩处理也是在这个模块中进行。这里重点讨论下编译器。
编译器
说起编译器,我们了解到的传统编译器架构分为前端、优化器和后端。
传统编译器的劣势是:前端和后端没有完全分离,耦合在了一起,因而如果要支持一门新的语言或硬件平台,需要做大量的工作。一种更加灵活,适应性更好的编译器套件应运而生——LLVM.
LLVM
官网:http://www.aosabook.org/en/llvm.html
LLVM是一个开源的,模块化和可重用的编译器和工具链技术的集合,或者说是一个编译器套件。
可以使用LLVM来编译Kotlin,Ruby,Python,Haskell,Java,D,PHP,Pure,Lua和许多其他语言。
LLVM核心库还提供一个优化器,对流行的CPU做代码生成支持。
LLVM同时支持AOT预先编译和JIT即时编译。
2012年,LLVM获得美国计算机协会ACM的软件系统大奖,和UNIX,WWW,TCP/IP,Tex,JAVA等齐名。