CodeReview技巧和规范

image1

What-什么是CodeReview?

CodeReview,即代码评审,是白盒测试中,静态测试的一种方法,通过阅读代码,提出代码层面的缺陷。

image2

Why-为什么做CodeReview?

测试左移:在测试前就发现代码缺陷。

明确测试范围:根据需求文档和代码,对齐测试范围,防止研发夹带本次需求范围外的代码上线。

提升代码能力:学习研发优秀的编程技术。

深入原理:了解系统内部结构及实现。

发现隐藏缺陷:能发现某些极端场景下的问题或概率性问题。

减少测试研发周期占比:节省用例执行个数,尤其多个同类异常梳理,不用执行类似用例,CodeReview一行代码即可。

Who-谁适合做CodeReview?

CodeReview需要三大门槛:

①熟悉编程语言,Java/Python/Go等。

②熟悉编程规范,《阿里巴巴XXX编码规范》、《华为XXX编码规范》、《京东XXX编码规范》。

③了解需求、架构和设计,需求文档/架构图/设计文档。

达到门槛才适合做CodeReview。

When-什么时候做CodeReview?

提测前,通过Code Diff Review,自己走读代码或者参与研发代码评审会议均可,

发现功能缺陷时,通过走查代码定位代码原因,并分析是否有关联缺陷。

修复缺陷时,阅读研发commit记录,检查是否引入新缺陷。

上线前,通过merge范围检查是否有夹带代码,为了测试改动的临时代码是否恢复。

Where-在哪里做CodeReview?

线上仓库(如Gitlab),适合于修改点单一,不需要查看上下文信息就能找到缺陷。直接在网页端评审代码且发表comment。

本地仓库(如IDEA),适合于修改点较多,需要查看上下文信息(变量或方法跳转到定义或使用之处)。在本地找到缺陷后在线上发表comment。

How-CodeReview如何上手?

准备:了解需求、架构和设计;学习编程语言;学习代码规范;

实践:坚持CodeReview,记录缺陷,定期总结。如果看代码找缺陷比较困难,可以先从发现功能缺陷后,定位代码原因入手。

常见CR缺陷:

除数为0、整数溢出、精度损失;

可能死循环;

在finally程序块中关闭或者释放资源;

异常未处理或提示不明确(没有catch异常,集合等没有判空和长度为0);

公式计算错误;

字符串对比不能用==,使用equals;

数组可能越界;

传递引用错误;

类型转换错误;

条件范围选择错误;

重点检查项:

一致性检查:是否需求相关;是否和方案设计一致;代码风格、日志规范、异常处理等是否和统一规范一致;

完整性检查:服务层是否包含了所有业务功能;数据层是否包含所有需要的数据和操作;

正确性检查:计算逻辑等业务逻辑是否正确;变量是否被正确定义和使用;代码是否符合制定的标准;

可修改性检查:代码涉及到常量是否易于修改,比如使用配置,定义为常量类等;建议业务方法只有一个出口和一个入口(异常处理除外);重要公共方法是否有交叉注释说明;重要的对外方法修改后影响多个下游接口;

可预测性检查:变量初始化;方法稳定性;代码是否存在死循环;代码无穷递归检查;

健壮性检查:代码是否采取措施避免运行时错误(如数组边界溢出、被零除、值越界、堆栈溢出等)

高可用性检查:是否有预案(降级开发、限流配置、兜底策略);补偿方案是否合理;

结构性检查:程序的每个功能是否都作为一个可辨识的代码块存在;

可理解性检查:是否使用到不明确或不必要的复杂代码;代码中的算法是否符合开发文档中描述的数学模型;每个变量都定义了合法的取值范围;

可验证性检查:代码功能是否便于测试;单元测试覆盖度是否足够;

可追溯性检查:代码是否包括一个修订历史记录,记录中对代码的修改和原因都有记录;

编码规范:

《阿里巴巴Java开发手册》

最新版本:黄山版(2022.2.3发布)

https://github.com/alibaba/p3c

image3