提升测试速度
分布式测试
核心思想是通过增加计算资源,并发的对测试Case进行执行,在执行后对测试结果进行解析合并,从而提升单次测试的执行速度。
分三个阶段执行
- 测试用例解析分发
- 分组测试用例执行
- 分组测试结果合并
分布式测试的本质是执行资源的堆叠,去换取更快的执行速度。理论上把每一个测试用例拆分到一个容器内执行,可以获得极致的反馈速度。但并不是所有场景下都适合采用分布式测试,比如用例之间存在依赖的。
精准测试
分布式测试很大程度上解决了测试执行速度的问题。但是在任何情况下都会全量执行用例的会存在一些问题:
- 对计算资源的浪费
- 引入大量的无效执行
- 用例稳定性问题导致排查时间浪费
什么是精准测试
通过建立测试用例与业务方法的关联关系,在代码发生变化时,精准的推荐出需要运行的用例。通过精准的圈定测试范围,可以带来效率和速度的双重收益。
基本要素
- 测试用例与应用代码方法关联关系的建立。定义为基线
- 代码发生变更,根据基线中用例与应用代码方法的关联关系,准确推荐出变化的方法、关联的测试用例和变化的测试用例
如何建立测试基线
- 通过字节码注入的方式,埋入trace调用,并在调用中传入用例与业务方法的签名。通过采集trace日志,拿到所有测试用例与方法调用链路,建立起用例与方法的关联关系。
- 通过AST解析的方式
如何进行用例推荐
方法的变化通常是新增、删除、更新。
提高测试有效性
编写和运行测试用例能够有效的覆盖代码的逻辑,其中测试覆盖率是一个重要的抓手,通过测试覆盖率来暴露问题,并促进问题的解决。
通常自动化测试集存在单元测、手工测试、API测试、UI测试等不同类型
单元测试
对于单元测试而言,覆盖率数据产生在单测执行的机器上,我们会根据执行机上的原始代码信息,编译后的class信息,以及变更的代码信息,计算出单元测试的覆盖率报告。
手工/自动化测试
云效提供了一个覆盖率采集客户端和一个覆盖率报告计算解析的平台。当我们再任意测试平台触发任意类型的自动化测试时,会通知覆盖率平台与采集客户端进行交互,完成计算与报告。
增量覆盖率
某一次测试过程中,变化的代码的测试覆盖率情况。
变化的代码 = 被测分支代码与目标对比分支的diff
增量覆盖率 = 变化的被覆盖的代码行/变化的代码行
通过增量覆盖率的反馈,开发/测试人员可以针对性的去补充各类测试用例,尽可能的保障在各阶段存在的测试遗漏。
线上覆盖率
通常上线的业务会部署多个副本,为了减少风险,会在其中的少量副本上进行覆盖率采集,会生成线上覆盖率报告。通常认为被覆盖到的代码都是有效代码,而剩下那些长时间没有流量覆盖的代码,需要谨慎删除/重构
通过这种方式,可以去指导开发人员进行代码重构,完成代码瘦身。