精准化测试的发展历史
精准化测试在 2019 年开始大热,在此之前的 10 年里,已经陆续有很多人投入研究,蚂蚁金服的两位 同学周为、翟帅两位同学的实时代码染色技术,把精准化测试提高了一个新的高度,并迅速在业界大 热。
- 百度利用覆盖率增量从回归数据中提取有效覆盖
- 精准定位用例数据与覆盖率关系
- 代码行为流建模
- 星云测试
- 有赞集成测试覆盖率统计实践
- 蚂蚁金服的代码实时染色
代码调用链分析
常见的调用链分析方法主要有
- 基于 AST 的语法树分析
- 基于字节码分析
调用链的动态分析方法
- 基于 gdb/jdb 的调试器分析
- jvmti/jvmpi
- jvm-sandbox、bytebuddy、btrace 共工具
代码覆盖率其实是一种丢失了时序结构的调用链数据。调用链的本质是一种具备调用节点顺序的列表, 覆盖率则是为了方便分析把列表降级成了集合。
调用链是一种图结构,可以适当的简化为树结构方便分析。根据代码的调用链,根据一些真实的项目做 了一个调用链的示意图,方便大家理解。
调用链就是一种带有分支的流程图。测试工程师提到的调用链,与架构师提到的调用链并不完全相同。 比如类似 skywalking、zipkin 之类的全链路 trace 系统是可以追踪代码的执行链路,多数可以到函数级 别,而测试工程师要分析代码的与业务之间的关系,需要追踪到代码行与分支级别。
用例与代码关联
建立关联关系的步骤
- 执行用例
- 获取用例对应的代码调用链
- 建模分析
精准化的关键,其实就是对业务、用例、代码进行关联建模并追踪他们的变化。
首先建立(业务,用例,代码调用链)三者的关联数据表,可以简单理解为 python 的三元组,或者 java 的 hashmap。如果业务不清晰,可以暂时用用例代替业务,如果调用链没分析清楚,可以暂时用覆盖率数 据作为替代。
应用场景
精准化测试的用途
- 根据代码变更定位用例范围
- 更准确深入的覆盖被测业务
- 白盒探索式测试
- 从线上数据反推有效测试用例
当新版本发布的时候,代码会发生变化(数据变化是另外一大话题,暂时忽略),首先分析代码范围, 然后分析变化点散落在哪些用例中,这样就可以重点关注被影响波及的测试用例集合,这样比全面回归 测试能更高效精准的发现问题。
同时根据新增代码的变更范围,我们也可以了解到我们漏测的部分,并加强未覆盖新增代码的测试验 证。在白盒层面我们就可以建立起来具备快速探索与反馈的测试活动,有效避免漏测。
同样利用线上的数据,也可以帮助我们反推测试用例,比如百度曾经就利用覆盖率拆分技术,把为期 2 天的全量回归测试优化为 2 个小时的回归测试。把每个测试用例对应的覆盖率或者调用链拆分,根据 覆盖率的不同可以自动划分为不同的等价类,从每个等价类集合中取少数代表性用例即可。通过这种方 式,可以有效弥补人工设计用例的不足。
打造自己的精准化测试平台
越来越多的公司开始招聘测试开发工程师,甚至是研发工程师设计自己的精准化测试平台,精准测试虽 然起源于测试团队,但是他的应用价值是超越测试,横跨整个产品开发团队的,所以精准化测试的平台 会是大势所趋。
为了照顾很多中小公司的同学,霍格沃兹测试学院为大家研究出了一套简化的适合中小公司使用的平民 版精准化测试技术体系,可以用来简单的实现精准化测试方案
- 使用 sonarqube 作为覆盖率与测试用例的分析平台
- 使用 jacoco 作为代码覆盖率的分析工具
- 使用 jacoco-cli 实现对单个用例的覆盖率收集
- 使用 scanner 完成覆盖率导入
- 调整 sonarqube 平台中覆盖率展示的信息,加入关联测试用例的展示,方便在未覆盖的代码附近可 以找到最接近的测试用例