我是靠谱客的博主 虚拟裙子,这篇文章主要介绍白盒测试之code-review,现在分享给大家,希望可以做个参考。

何为白盒测试

白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。 —— [ 百度百科 ]

为什么做code review

  • 互联网公司发版节奏快,大都公司都采取两周设置一周一个版本。对于兜底(背锅)的测试来说,压力山大
  • 测试人员没有充足的时间去测试,有时甚至会临时插入需求,基于黑盒很难覆盖到每条路径
  • 开发改动代码并未知会测试,这部分改动可能会存在风险
  • 可以完善测试分析、提前发现bug、降低质量风险和测试成本
  • 学习开发的技术,提升自己的代码能力,提升自己的职业竞争力

学会阅读代码

拿到需求文档,架构文档、时序图后,自己对这个需求及逻辑有一定的理解,最好能思考自己会选择怎样实现。接着去了解开发对这个开发的理解以及实现,过程中可以思考存在的风险。接着了解工程设计的层次结构,找到程序的入口,根据找到的入口,就可以从上往下,层层展开,阅读代码就变得容易了。

重点review部分

  • 影响主流程跑通的类和方法
  • 多个地方调用到的,影响面大的公共方法,即底层代码
  • 涉及逻辑以及金额的代码

注意:常规检查点主要分NPE、异常处理、内存泄露、数组越界、资源浪费、精度问题、文件路径权限、隐私安全、参数校验、多线程问题、全局资源、除零错误、缓存问题。

常规检查点

参数校验
1、 对照接口文档、重点关注对应的request类是否对参数进行了必传、长度、取值范围、类型的校验
2、 注意是否继承了某个类,父类中是否存在对参数的校验
NPE
1、方法参数如果不能为空时,是否做了判空处理,或者在方法调用者传入参数时是否确保了不为空
2、当被调用的方法(如下游系统方法)返回为null时,调用者是否有进行判空处理
3、使用的对象是否在使用的时候时已经被初始化
4、方法是否有返回null的情况,如果有是否可以改成为返回一个空白对象(如没有元素的列表等)
5、某些赋值或条件,如果不进行适当的健壮性处理,会存在空指针的隐患
复制代码
1
2
3
4
if(request.getKey().equals("abc")){ System.out.println("key is abc"); }
异常处理
1、任何可能出错的函数调用(语句),必须加异常处理。包括但不限于网络交互(超时)、数据库交互(连接是否成功、超时)、读取请求数据包(判断返回值、脏数据)、文件系统操作
2、对于异常的处理,需要注意异常处理一定要充分、异常判断的时机、条件一定要正确
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String fileName = ""; InputStream inputStream = null;//声明个引用,因为这个new对象的时候也是会异常的 try { //这里就会异常,如果文件名不存在的话。 inputStream = new FileInputStream(fileName); } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); // 关闭流 } catch (IOException e) { e.printStackTrace(); } } }
内存泄露
1、线程对象使用完毕是否正常结束
2、各种数据库、网络连接和文件IO被打开后,是否正确关闭
3、图片资源是否正确释放
4、缓存对象要有一定大小控制,且有明确的释放策略
5、对象如果注册了事件回调,是否在合理的地方进行了反注册
资源浪费
1、对变量赋值,而该变量从未使用
2、对象无意义的new了一个实例
3、字符串大量使用+连接
复制代码
1
2
3
Demo demo = new Demo(); demo = CreateDemo.invoke();
精度问题
1、float、double这类浮点数经常出现精度问题,尤其在类型转化的过程中容易导致精度丢失
2、互联网金融一般使用BigDecimal,BigDecimal有三个构造函数,看到使用了BigDecimal(double val)时,需要谨慎,可能会存在精度问题。尽量使用int、String的构造函数
复制代码
1
2
3
4
5
6
Double dd= Double.valueOf(s); BigDecimal bigD = new BigDecimal(dd); bigD = bigD.multiply(new BigDecimal(100)); Long result = bigD.longValue(); //当输入S为9.86时,输入result为985
多线程问题
1、识别全局资源
2、看到资源的读写和更新,必查加锁
3、看到加锁操作,必查加锁范围
4、看到资源的获取和访问之间有时间间隔,必查资源是否会被更新
5、识别线程不安全函数(Arraylist、hashmap、StringBulider、HashSet、simpledateformat、DateFormat)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class MyThread extends Thread { private SimpleDateFormat sdf; private String dateString; public MyThread(SimpleDateFormat sdf, String dateString) { this.sdf = sdf; this.dateString = dateString; } @Override public void run() { try { Date date = sdf.parse(dateString); String dateStr = sdf.format(date); if(!dateStr.equals(dateString)) { System.out.println("ThreadName=" + this.getName() + "报错了,日期字符串:" + dateString + ",转换成的日期字符串:" + dateStr); } else { System.out.println("ThreadName=" + this.getName() + "成功,日期字符串:" + dateString); } } catch (Exception e) { e.printStackTrace(); } } } public class Test { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String[] dateString = {"2017-11-05","2017-11-06","2017-11-07","2017-11-08","2017-11-09","2017-11-10","2017-11-11","2017-11-12","2017-11-13","2017-11-14"}; Thread[] threads = new Thread[10]; for (int i = 0; i < threads.length; i++) { threads[i] = new MyThread(sdf, dateString[i]); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } }
文件路径 、权限问题
1、对服务器进行读写文件的操作时,需考虑各个测试环境,对这个路径的权限问题
隐私安全
2、对于金融产品涉及的账密、证件、手机、银行卡等敏感信息是否进行了脱敏处理
除零错误
1、除法或者取模操作,必加除数为零的判断
2、浮点转整型会丢失小数部分,特别需要关注0.*变成0的情况
复制代码
1
2
3
4
5
float a = 0.5f; int b = (int)a; int c = a / b; //b为0;
数组越界
1、访问数组时,如果访问了数组定义之外的范围,即下标落在区间[0, size-1]之外,会导致程序运行错误
2、当下标存在加减时,需判断改变的下标是否越界
3、如果是分割字符串产生的数组,取数组的值前一定要判断下标是否在数组长度范围内
4、取数组或列表时,需要先判断数组或者列表的长度不为0
复制代码
1
2
3
4
String Appversion = "6.1.0"; String[] strArr = version.split("_"); String version = srtArr[1].trim();
逻辑函数
1、对条件组合判断,特别是超过两个时,或者为||、&&组合使用个时很容易出错
2、是否所有分支都得到了合理的处理,如没有写出了的else以及switch的default分支
中途返回
1、在运行过程中,达到某种条件,使程序中途return的情况。需要注意是否存在return导致某些逻辑不能正确执行到的情况
取错值、传错值
1、该错误需要我们review代码的时候细心。

可以关注来点儿干货呀公众号~

最后

以上就是虚拟裙子最近收集整理的关于白盒测试之code-review的全部内容,更多相关白盒测试之code-review内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(115)

评论列表共有 0 条评论

立即
投稿
返回
顶部