作者简介
Kevin,携程后端开发专家,追求通过深入业务来简化系统,对底层算法、数据分析有浓厚兴趣。
一、引言
1.1 背景
微服务架构下,产研分工精细,需求迭代频繁,随着需求的不断迭代,应用数、代码量及测试用例越积越多;需求迭代(尤其是有新人加入)的过程中,产品经理需要通过开发了解现状和历史逻辑,开发人员翻阅历史代码花费的时间和精力越来越大,测试人员上线前需要回归的用例也越来越多,严重影响了需求迭代的效率。
1.2 现状分析
目前携程旅游BG的后端开发人均应用数超过4个,人均维护的代码行近20万行;每月平均需求迭代的发布超过2千次,其中核心应用数占比及其发布次数占比都超过8成。
为了提高需求迭代的效率,旅游技术团队设计开发代码分析平台,对应用的现状(主要是源代码和测试用例)进行综合分析发现:生产应用中高达三分之一的代码属于dead代码(没有被引用,也没有任何生产流量),严重影响开发效率;日常迭代中68%的自动化回归用例与当前迭代无关,但是为了保障上线质量,测试人员需要对每条失败用例进行分析排查,不仅影响当前的交付进度,而且随着需求的快速迭代,自动化测试的可持续性堪忧。
二、代码分析规划
本文主要基于后端Java应用介绍如何实现代码分析平台化,并借助平台工具实现精准测试和应用瘦身。平台可以帮助开发人员识别无效代码,在短时间内以最小的风险完成应用瘦身,极大的提高研发的效率;同时通过平台的用例知识库进行精准测试,在需求迭代过程中只执行本次改动相关的用例,极大的提高自动化回归的效率和可持续性。如下图:
图1 代码分析与精准测试、应用瘦身
2.1 分析应用现状
通过对应用系统综合分析,形成知识库。分析的对象包括源代码(不含第三方引用)、对外提供的服务(包括api、任务以及消息)、自动化用例、日常迭代变更以及方法维度的生产流量等。知识库包含应用基本信息、统计信息(例如代码规模、方法规模、用例规模)、方法链路信息、用例链路等。
2.2 工具化及流程闭环
利用分析得到的知识库,针对特定场景进行工具化和流程闭环,辅助应用治理。
例如精准测试场景,平台可以与发布流程结合起来,开发提测后自动识别变更内容,并智能推荐自动化用例并执行,将执行结果实时同步给开发和测试人员,实现变更→发布→用例推荐、执行、反馈→修复变更的闭环。
应用瘦身场景,从开发角度来看,平台需提供多视角的辅助分析工具,帮助开发人员确定方法/类是否可以安全的删除;从管理角度来看,平台需划定应用治理前的基线,并将无效代码比例作为应用长期治理对象,从而实时评估下属治理的进度和效果,形成治理过程的闭环。
三、代码分析原理
代码分析的基本单元是方法,主体是应用的整个生命周期,从应用的代码仓库建立以及研发完成代码开发,到测试发布,再到生产运行,我们对不同阶段方法的关联信息进行分析,最终得到一个完整的知识库,分析流程及定义如下图:
图2 代码分析原理
3.1 静态分析
通过源代码解析工具解析出所有的方法声明及调用关系。
针对Java语言常见的解析工具及原理如下:
推荐使用java-callgraph2,理由是java-ca