传统测试强调对原有系统的全面覆盖,而精准测试分析通过关注开发实现,从代码层面确定测试范围。从全面测试用例到通过测试分析判断修改的代码,得出测试范围,使得测试的时间与效率都有很大的提升。

差异化

精准测试需要指哪打哪,所以我们需要通过关注开发实现,寻找测试对象的差异。精准测试的测试对象,包括:迭代之间的差异部分,及差异部分所影响的其他功能。

差异化解决了改什么、测什么的问题。

技术实现差异

  1. 系统设计上的差异:
    • 系统架构上分析:当前模块和相关的外围系统
    • 时序图
  2. 工程上的差异:
    • 代码差异:SVN-diff
    • 文件差异:基于反汇编的基本块跳转关系的二进制对比
      • 工程引用第三方库
      • 编译时配置的不同编译参数,编译开关

自动分析二进制文件差异化(IDA pro)

  1. 对二进制文件进行逆向反汇编,提取二进制文件的反汇编信息
  2. 对反汇编信息进行比对以计算函数的差异性

整个对比过程分为3个部分:

  1. 建立基本块跳转控制流程图邻接矩阵
  2. 基本块签名提取与匹配:采用基本块的hash值作为基本块的签名。如果两个基本块的hash值相同,则其指令集合是相同的。
  3. 基本块边匹配:在基本块hash相同的基础上,进一步对跳转关系进行判断,如果两组hash相同的基本块存在一致的跳转关系,则说明两组基本块满足边匹配判定,属于相同基本块。

技术治理

技术治理简单说就是关系链,它是用来分析技术实现上的各种耦合关系。

技术治理是为了搞清楚改什么、影响什么。

系统内治理

  • 关键词索引法,通过关键字找到类/方法名,再去全量代码搜索关键词。但这个方法并不准确,例如重名就会产生极大的干扰。
  • 分析二进制的逆向方法,动态解析调用关系。如利用IDA的逆向函数对二进制文件进行分析。
  • 动态解析,针对java。在java虚拟机中,对字节码进行增强,通过java程序运行过程中的调用路径进行记录,从而跟踪到类/方法之间的调用关系。

度量及分析闭环

通过代码覆盖率来度量测试精准度。

分析闭环建立

  1. 测试分析:得到测试范围集合
  2. 测试执行:手工执行用例
  3. 统计代码覆盖率
  4. 覆盖率结果分析
  5. 反馈调整:根据分析结果,针对未覆盖代码进行补充,无需覆盖的代码进行记录