golang 生成测试覆盖率_有赞iOS精准测试实践

bedfa6ec17cb14673d21ac48ece9cec1.png

点击关注“有赞coder”

获取更多技术干货哦~

6f69af73d0fcbe19297964269dc15dfa.png 作者:周夏赛 团队:有赞零售

一、背景

近几年有赞零售业务快速发展,为了满足日益增多的业务需求,2019年起零售客户端发版改成了每周一次,在质量保障方面,技术团队要面对更大的挑战。故此我们团队做了很多研究,希望通过技术工具来提升移动端测试的质量和效率,这是我们研发移动端精准测试平台的初衷。

目前业内移动端的测试手段主要有两种,一种是手工测试,手工测试是移动端目前主流的测试手段,一般流程是先根据业务场景梳理出对应的测试用例,然后将测试用例分配给开发和测试人员,由他们分别执行用例,排查问题;另外一种是单元测试,单元测试是通过工具进行自动化执行,执行完单元测试,除了根据单元测试的结果来判断代码质量,还可以获得对应的代码执行覆盖率的信息,这个是对单元测试结果的量化分析。这两种测试也有各自的不足,手工测试的覆盖范围依赖于相关人员的业务理解,缺少量化的评估,单元测试用例通常需要根据业务需求的迭代而频繁更新,维护成本较高。因此我们想要研发一个工具,可以支持手工测试的代码覆盖率分析,将两种测试手段的优势结合,这个工具就是移动端精准测试平台。

本文会从iOS端来介绍精准测试的实现原理和我们的实践经验。

二、原理

代码覆盖率,顾名思义,就是代码在测试中被执行的比例,测试场景包括 单元测试系统测试 。覆盖率结果主要分为以下两种:行覆盖率:用于度量工程中每行代码在测试中是否被执行。分支覆盖率:用于度量代码中每个判定分支是否被执行。

2.1 代码插桩

统计代码覆盖率的前提是对代码进行插桩,OC 是 C 语言的一个超集,而 LLVM 脱胎于 GCC,我们可以使用 GCC 的插桩器对 OC 代码进行编译插桩,具体流程如下:

707541b9009000ba351a7a485a188c81.png

源代码在预处理程序处理后生成预处理文件,预处理文件经过编译程序编译后生成汇编文件。编译插桩就是在编译的过程中,向汇编代码中注入计数汇编代码,从而生成插了桩的汇编文件,再经过后续的汇编程序和链接程序生成可执行文件。同时,在编译完成时会另外生成一个 gcno 文件(源文件名.gcno)用于记录程序的桩点信息。插桩编译后的可执行文件在程序中执行后会生成带有统计信息的 gcda(源文件名.gcda)文件,两个文件一起用于代码执行的次数统计文件的生成。

2.1.1 基本块

从编译器角度看,基本块(Basic Block,下文简称 BB)是代码执行的基本单元,LLVM 基于 BB 进行覆盖率计数指令的插入,BB 的特点是:

  1. 只有一个入口。

  2. 只有一个出口。

  3. 只要基本块中第一条指令被执行,那么基本块内所有指令都会顺序执行一次

因此,一个函数的实现由 N 个基本块组成,示例如下:

130e01dc7936eb46ace363b1ff0f9f07.png

2.1.2 gcno 文件

一个源代码文件由 N 个函数组成,一个函数实现由 N 个基本块组成,插桩流程亦即:

  1. 遍历源代码文件中的所有函数,记录函数的位置信息:向 gcno 文件中写入函数名及行号。

  2. 遍历函数中的所有基本块,创建计数器数组,用于运行时统计基本块执行情况:向 gcno 文件中写入基本块信息及块行号。

因此,gcno 文件由以下内容组成:

  1. 校验信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值