对于产品质量的保证,代码review是重要环节,通过代码审查可以高效快速的发现问题,提高测试效率,提高产品质量。
代码检查的错误列表:
针对异常业务逻辑的处理
1.幂等的处理(包括支付幂等、退款幂等、查询幂等);
2.补偿时的状态流转是否正确、task时间配置;
3.回调MQ对应topic配置,上下游是否匹配;
5.事务完整性及一致性;
6.与原有业务逻辑不兼容;
7.API版本是否正确;
8.通用逻辑与定制业务逻辑是否耦合;
9.并发的处理;
10.代码风格与整体不一致;
11.乐观锁与悲观锁的使用;
12.异步通知先于同步返回的处理;
13.关单等的时间设置;
14.改动的接口所关联及影响的业务;
代码规范
1.是否验着按照命名规范;
2.代码风格是否统一;
3.代码缩进等格式是否统一;
1.被调用模块接收到的形参数量是否等于调用模块发送的实参数量,且数量是否一致;
2.实参的属性是否已形参的属性相匹配;
3.实参的单位是否与形参的单位相同;
4.模块间传递的实参数量及属性、单位等是否匹配;
5.如果调用了内置函数,实参的数量、属性、顺序是否正确;
6.如果某个模块或类有多个入口点,是否引用了与当前入口点无关的形参;
7.全局变量的定义在模块间是否一致;
1.是否配置分离
2.所有环境配置文件中信息的配置是否正确
是否存在大量的重复代码,导致代码冗余,代码结构不清晰;
异常处理的检查
容易出错的地方未进行潜在异常的捕获(try...catch)
例如:对数据库的操作异常、调用下游接口异常、库函数的异常、系统服务的异常;
数据引用错误
1.是否有引用的变量未赋值或未初始化;
2.对于所有的数组引用,是否每一个下标的值都在相应维规定的界限之内;
3.对于所有的数组引用,是否每一个下标的值都是整数;
4.对于所有的通过指针或引用变量的引用,当前引用的内存单元是否分配;
5.变量值的类型和属性是否与编译器所预期的一致;
6.假如一个数据结构在多个过程或子程序中被引用,那么每个过程或子程序对该结构的定义是否都相同;
7.如果字符串有索引,当对数组进行索引操作或下标引用,字符串的边界取值是否有“仅差一个”的错误。
数据声明错误
1.是否所有的变量都进行了明确的声明;
2.如果变量的属性在声明中没有明确说明,那么默认的属性能否被正确理解;
3.如果变量语句在声明中被初始化,那么他的初始化是否正确;
4.是否每个变量都被赋予了正确的长度和数据类型;
5.变量的初始化是否与其存储空间的类型一致;
6.是否存在着相似名称的变量。
运算错误
1.是否存在不一致的数据类型的变量间的运算;
2.是否存在混合模式的运算,容易出现取整误差;
3.是否有相同的数据类型、不同字长变量间的运算;
4.赋值语句的目标变量的数据类型是否小于右边表达式的数据类型或结果;
5.在表达式的运算中是否存在表达式向上或向下溢出的情况;
6.除法运算中的除数是否可能为0;
7.在特定场合,变量的值是否超出了有意义的范围;
8.对于包含多个操作符的表达式,赋值顺序和操作符的优先顺序是否正确;
1.是否存在不同数据类型变量之间的比较运算;
2.比较运算符是否正确;
3.每个布尔表达式所叙述的内容是否都正确;
4.布尔运算符的操作数是否是布尔类型的,比较运算符和布尔运算符是否错误的混在了一起;
5.赋值顺序以及运算符的优先顺序是否正确;
1.如果程序包含多条分支路径,索引变量的值是否会大于可能的分支数量;
2.是否所有的循环最终都终止了;
3.程序、模块或子程序是否最终都终止了;
4.由于实际情况没有满足循环的入口条件,循环体是否有可能从未执行过;
5.如果循环越界了,后果会如何;
6.是否存在“仅差一个”的错误,如迭代数量恰恰多一次或少一次;
7.编程中的语句组或代码块,是否都有一个明确的while语句;
8.是否存在不能穷尽的判断。
输入/输出错误
1.文件属性是否正确;
2.I/O语句是否符合格式规范;
3.程序读取的文件是否有足够的空间存贮;
4.是否所有的文件在使用前都打开了;
5.是否所有的文件在使用后都关闭了;
6.文件结束条件是否正确处理;
7.是否处理了I/O错误。
其他检查
1.缺少必要的日志;
对于重要的实例状态、代码路径及API调用,应添加必要的INFO日志;对于异常,应当捕获并添加Error日志;缺乏日志会导致排查问题困难,代码不易理解,难以做数据统计和分析。
2.错误码不符合规范;
对错误码进行可控的管理和遵循规范使用,根据不同系统,有标识性的错误码定义。
3.硬编码;
魔数(幻数):代码中杜绝幻数,幻数可定义为枚举或常量;
写死的配置:尽量避免有写死的配置在代码中,进行配置分离;
临时加的逻辑和文案:抽离进行函数或方法的封装;
4.case结构中break的检查;
5.是否缺少必要的注释;