啃开发同事的代码,来获得测试灵感,应该是一名测试老兵的本能。啃代码,怎么啃,从哪儿啃起,每个人都有自己的习惯方式。我一般会采用两种方式来研究产品代码:一种是以产品功能为线,从核心模块开始,了解功能实现;另一种是基于某种度量工具的输出结果,尤其是代码复杂度指标,从逻辑复杂的类或者方法开始,了解它们被调用的情况,引用的第三方库。如果开发在更新或重构代码时,测试人员也能对变更的影响做个风险评估,那便是极好的。
在实际工作中,第一种方式是我刚刚接触项目或产品会采用的,借机熟悉业务;而第二种一般是我对业务有了一定的了解,甚至进入了疲劳期,就借由工具生成的度量结果,重新审视产品代码。
pdepend 是一款度量 PHP 代码的开源免费工具( https://github.com/pdepend/pdepend ),目前最新版本是 2.2.4。使用方法在官网上已经介绍得很明确( https://pdepend.org/documentation/getting-started.html ),我这里对 pdepend 输出的度量指标做个简介。
pdepend 可输出三个文件:xml 格式的 summary report,以及两个 svg 矢量图文件。通过矢量图,可以对 PHP 项目规模有个直观的了解。如下图 pyramid overview,可以看出“继承”,“规模&复杂度”,“耦合”三个方面的数据。如:有效代码行数(LOC)是 55105; 有 13个 Packages,362个 Classes,3137 个 Methods(包括 class 中的 method,以及外部定义的)。简称对应的详细说明:https://pdepend.org/documentation/software-metrics.html
CYCLO复杂度度量元 是 1976 年由 ThomasJ. McCabe 提出的概念,它根据分支与循环的关键字度量代码复杂度。下图中,0.195 是 CYCLO/LOC; 17.566 是 LOC/NOM... 之所以注明 Low,Average,High,是因为 pdepend 有对应的参考值:https://pdepend.org/documentation/handbook/reports/overview-pyramid.html 那么,通过比较高的四个值:ANDC,AHH,NOC/NOP, LOC/NOM,我可以得到什么线索呢——
ANDC:派生类平均值;比如有10个类,若 ANDC 值为0.5,意味着平均每两个类,派生自另一个类。图中值偏高,说明父类派生出了“过多”的子类
AHH:继承层次(深度)平均值;比如有10个类,若 AHH 值为1,可以理解为,5个类继承于另外5个类;或是5个类继承于一个基类。图中值偏高,说明继承层次较多,这一点在直接阅读代码的过程中应该有更明显的感受,毕竟路径越深,代码啃得越痛苦。
NOC/NOP:值偏高,说明对于 classes 数量而言,packages 偏少。
LOC/NOM:值偏高,说明对于代码行数而言,methods 偏少。
另一个 svg 矢量图,类似 JDepend 的生成结果。包括 Instability (不稳定指数) 和 Abstractness (抽象度) 两个维度。
Ca - Afferent Couplings:指一个 package 内的抽象类或接口。若变化会影响其他模块
Ce - Efferent Couplings:被该 package 依赖的外部 package 的数目。即,被其他模块影响
Instability:ce/ca+ce ,值在0至1之间,指数越小,越稳定
Abstractness:ac/ac+cc ,值在0至1之间,若值为1,说明包中只有抽象类和接口
越靠近绿色斜线,Instability 与 Abstractness 平衡程度越好。而下图中,大部分 packages 在 Instability 与 Abstractness 没有达到很好的平衡。
以上只是对 PDepend 生成的两个 svg 文件进行了解读,而如果需要深入到具体的文件、类,方法中,就需要解析生成的 xml 文件了。我最近在学习 mongo db,正好借机会把 xml 转成 json 文件,导入到 mongo 中,再通过 mongo shell 查询出需要的信息。下篇再表。