测试开发实战|精准化测试技术解读与平台构建最佳实践 | 测试开发前沿趋势

精准化测试技术解读与平台构建最佳实践 | 测试开发前沿趋势

一、精准化测试是什么?

传统的软件测试技术主要基于测试人员对业务的理解,但由于经验与真实业务数据的差距,肯定会测试不充分,所以很多情况下,测试结果无法精确保证对软件质量的定义和判断。

精准化测试技术从字面理解,就是非常准确的测试,这意味着要 用量化的数字说话

精准化测试是一种可追溯的软件测试技术 。通过构建一套计算机测试辅助分析系统,对测试过程的活动进行监控,将采集到的监控数据进行分析,得到精准的量化数据,使用这些量化数据进行质量评价,利用这些分析数据可以促进测试过程的不断完善,形成度量及分析闭环。

精准化测试的核心思想 就是:使用非常精确和智能的软件来解决软件测试的问题,从根本上引领软件测试从经验型方法向技术型方法的转型。 质量的评估不再靠经验,而是通过精准的数据来判定。

二、精准化测试的发展历史

早在十年之前,测试行业就已经有很多人陆续投入精准化测试的技术研究。2019 年开始,精准化测试在业界大热,其中,蚂蚁金服的两位同学周为、翟帅在 MTSC 测试开发大会上分享的《进击的覆盖率 —— 实时代码染色技术》,可以说把精准化测试技术提到了一个新的高度,并迅速推动了在业界的应用普及。

  • 百度利用覆盖率增量从回归数据中提取有效覆盖
  • 精准定位用例数据与覆盖率关系
  • 代码行为流建模
  • 星云测试
  • 有赞集成测试覆盖率统计实践
  • 蚂蚁金服的代码实时染色

三、核心技术:代码调用链分析

常见的调用链分析方法主要有:

  • 基于 AST 的语法树分析
  • 基于字节码分析

调用链的动态分析方法:

  • 基于 gdb/jdb 的调试器分析
  • jvmti/jvmpi
  • jvm-sandbox、bytebuddy、btrace 等工具

代码覆盖率其实是一种丢失了时序结构的调用链数据。调用链的本质是一种具备调用节点顺序的列表,覆盖率则是为了方便分析把列表降级成了集合。

调用链是一种图结构,可以适当的简化为树结构方便分析(谁说测试不需要懂数据结构与算法的……)

我们根据代码的调用链,根据一些真实的项目做了一个调用链的示意图,方便大家理解。

调用链就是一种带有分支的流程图。测试工程师提到的调用链,与架构师提到的调用链并不完全相同。

比如类似 Skywalking、Zipkin 之类的全链路 Trace 系统是可以追踪代码的执行链路,多数可以到函数级别,而测试工程师要分析代码的与业务之间的关系,需要追踪到代码行与分支级别。

四、用例与代码关联

建立关联关系的步骤:

  1. 执行用例
  2. 获取用例对应的代码调用链
  3. 建模分析

精准化的关键,其实就是对业务、用例、代码进行关联建模并追踪他们的变化。

首先建立业务、用例、代码调用链三者的关联数据表,可以简单理解为 Python 的三元组,或者 Java 的hashmap。

如果业务不清晰,可以暂时用用例代替业务,如果调用链没分析清楚,可以暂时用覆盖率数据作为替代。

五、精准化测试应用场景

精准化测试的用途:

  1. 根据代码变更定位用例范围
  2. 更准确深入的覆盖被测业务
  3. 白盒探索式测试
  4. 从线上数据反推有效测试用例

当新版本发布的时候,代码会发生变化(数据变化是另外一大话题,暂时忽略),首先分析代码范围,然后分析变化点散落在哪些用例中,这样就可以重点关注被影响波及的测试用例集合,这样 比全面回归测试能更高效精准的发现问题

同时根据新增代码的变更范围,我们也可以了解到我们漏测的部分,并加强未覆盖新增代码的测试验证。在白盒层面我们就可以建立起来具备快速探索与反馈的测试活动, 有效避免漏测

同样利用线上的数据,也可以帮助我们反推测试用例,比如百度曾经就利用覆盖率拆分技术,把为期2天的全量回归测试优化为 2 个小时的回归测试。把每个测试用例对应的覆盖率或者调用链拆分,根据覆盖率的不同可以自动划分为不同的等价类,从每个等价类集合中取少数代表性用例即可。通过这种方式,可以 有效弥补人工设计用例的不足

六、打造自己的精准化测试平台

越来越多的公司开始招聘测试开发工程师,甚至是通过研发工程师来设计自己的精准化测试平台。精准测试虽然起源于测试团队,但是他的应用价值是超越测试,横跨整个产品开发团队的,所以 精准化测试的平台会是大势所趋

为了照顾很多中小公司的同学,霍格沃兹测试学院为大家研究出了一套简化的、适合中小公司使用的 平民版精准化测试技术体系 ,可以用来简单的实现精准化测试方案:

  • 使用 SonarQube 作为覆盖率与测试用例的分析平台
  • 使用 JaCoCo 作为代码覆盖率的分析工具
  • 使用 JaCoCo-cli 实现对单个用例的覆盖率收集
  • 使用 Scanner 完成覆盖率导入
  • 调整 SonarQube 平台中覆盖率展示的信息,加入关联测试用例的展示,方便在未覆盖的代码附近可以找到最接近的测试用例

总结一下,精准化测试不仅仅是测试左移的技术,它同时也可以是一种测试右移的实践。

线上数据的提炼、线上用户的调用链分析,也会逐渐成为未来线上测试的一种趋势 ,到时候就会需要一些强大的大数据平台做质量分析。