一、常见cr问题
- 语法特征错误(不影响编译,但是运行阶段出错),如数组越界
- 边界行为特征错误,如a/b , b = 0
- 经验特征错误,如逻辑判断写成了赋值语句
- 部分算法错误:在特定条件或者输入情况下,算法不能准确完成业务要求实现的功能,如两个整数相加可能会出现和越界的情况
二、单元测试
- 单元测试用例“输入参数”的复杂性
- 被测试函数的输入参数
- 被测试函数内部需要读取的全局静态变量
- 被测试函数内部需要读取的类成员变量
- 函数内部调用子函数获得的数据
- 函数内部调用子函数改写的数据
- 嵌入式系统中,在中断调用中改写的数据:在某些中断事件发生并执行中断函数时,中断函数很可能会改写某个寄存器的值,但是被测函数的后续代码还要基于这个寄存器的值进行分支判断
- 单元测试预期输出:
- 被测函数的返回值
- 被测函数的输出参数
- 被测函数所改写的成员变量和全局变量
- 被测函数中进行的文件更新、数据库更新、消息队列更新等
- 关联依赖的代码不可用:使用桩函数,隔离不起,实现被测函数的逻辑控制
- 空值:值为null导致空指针异常,参数字符串含有前导或后缀空格没有Trim导致查询为空,建议添加空值检测,在参数入口统一做trim
- 未捕获的异常:调用API接口、库函数或系统服务时,一定要添加防护,做防御式编程,要么在当前方法捕获异常并返回合适的空值或空对象,要么抛给高层处理
- 低性能:
- 循环或逐个调用单个接口获取数据或访问数据库:建议提供批量接口或批量处理并发获取数据
- 重复创建几乎完全相同的对象:将可复用对象抽离出循环,一次创建多次使用
- 数据库访问、网络调用等服务未处理超时的情况:设置合理的超时时间并捕获超时异常处理
- 多重循环对于大数据量处理的算法性能低:使用预排序或预处理,构造合适的数据结构
- 大量字符串拼接是使用了String而非StringBuilder:少量字符串拼接用String,大量用StringBuilder
- 影响范围过大:对多个模块依赖的公共函数的修改,建议抽离出新的函数,抽离原函数的可复用部分,然后基于可复用部分构建新的函数
- 单测问题
- 与原有逻辑不兼容
- 缺乏必要日志:对于重要而关键的实例状态,代码路径及API调用,适当添加INFO日志,对于异常,应添加捕获和ERRO日志
- 错误代码不符合规范
- 参数检测缺乏或者不足:建议集中管理,对应用中的所有参数进行统一集中化检测
- 引用错误、细节错误