阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      避免 BUG 和方便查找 BUG 的思路

      遇到一个 BUG,感觉值得记录一下;

      BUG 场景描述:

      第一步、弹窗X中,通过用户二维码,调用接口A,获取用户的代理商类型等信息;
      第二步、通过判断用户的代理商类型,赋type值,并且PUSH接口B得到订单的出库类型;(这里的判断值,type赋值,前端出错了)
      第三步、得到订单的出库类型后,在校验弹窗Y展示订单号和需要出库的user_id/用户名、类型,设备去向;供操作者校验订单号与代理商信息,如果校验没问题,可以在校验的窗口直接输入出库设备,PUSH到接口C;(校验窗口Y有两个作用,1 是供操作者校验信息,2是储存接口C所需要的参数);
      

      根本原因:一个值判断错误,

      proxy_type:无需判断 – > type:1;
      proxy_type:0 – > isNoDIstributor();//手动抛出错误,非代理商,普通用户;
      proxy_type:1 – ->type:2;
      proxy_type:2 —>type:2;
      proxy_type:3—>type:3;
      

      前端代码中的错误:

      需要 PUSH 接口 B,并且获得订单号的参数 type 值;在赋值之前没有清零;
      

      后端接口中的错误:

      生成出库订单的接口 B,在返回出库订单的同时,应该把此次需要出设备的用户数据一起返回(与订单号耦合在一起);校验弹窗 Y 里需要操作者校验的信息,应该由后端进行信息输出,这样可以保持数据的准确行;(目前的校验弹窗 Y 中,订单号是由后端输出的,用户数据是由前端输出的【弹窗 X 中,获取用户二维码的时候,前端把接口 A 返回的信息保存在一个变量里,然后输出在校验页面】)
      

      目前遇到难以排除的 BUG 原因是:

      接口 B 接收的参数 type 值虽然是错误的,但是可以正常返回出库订单号,表象是接口 B 调用成功了;

      真实情况是:接口B接收错误的参数,正常生成了出库订单号,但是与订单号匹配的用户信息是异常的;

      校验页面显示情况是:订单号正常显示,订单号匹配的用户信息也显示正常(表象是正常的)

      在前端调用接口 C 的时候,接口 C 会验证接口 B 的订单号和用户 user_id,如果异常,会出库失败;(接口 B 虽然生成了订单号,但是匹配的用户信息是异常的;此时的订单号虽然显示正常,但属于异常的订单,接口 C 验证时候肯定是通过不了的,后端接口 B 在接收错误参数时,不应该正常生成订单号的);

      解决和避免以后出现类似问题的方法:

      前端:前端数据严格的清零后再赋值;这样赋值错误的时候,很容易查到错误原因;(测试的时候,应该更仔细一些,多考虑一些可能的异常情况)

      后端:后端接口在参数接收错误的时候,不应该返回正常的订单号;并且需要校验的数据应该由后端统一输出,不应该前端输出一部分(用户信息),后端输出一部分(出库订单号);然后让操作者校验用户信息和订单号是否匹配(两个不耦合的东西,操作者是不能判断是否属于匹配数据的);

      最终结果:

      1、操作者:因为订单号和用户信息都有,用户信息是显示正常的,是自己想出的代理商,订单号是正常显示的(操作者不知道订单号已经是错误的订单号码,只要正常显示,操作者都以为生成出库订单正常了),但是正常出库设备的时候,返回的是出库失败;操作者就懵逼了,找不到原因;

      2、前端看到订单号正常生成,以为接口调用成功了,没有察觉到传参的值是错误的了;以为已经获得了与用户信息匹配的出库订单号;(前端处理流程是:如果成功获得了与用户信息匹配的出库订单号,就把用户信息输出在校验窗口);前端看到订单号正常,用户信息正常,也一脸懵逼;

      3、后端:看校验页面用户信息和订单号都正常显示,但是出库却失败了,也很无奈;

      这种情况下,只有在打断点,看每一步的参数,然后在接口中确认才能发现到底是哪一步出现问题了;

      改进办法:

      前端:严格处理好自己的数据,不要修改或者主动赋值没有的信息到校验窗口(这里的用户信息就不应该前端输出,而是让后端把订单号,用户信息都返回给前端,前端只做展示即可);

      后端:校验窗口的出库的数量,出库的订单号,出库订单号匹配的用户信息,应该在接口中返回;不应该让前端自己组装信息让用户校验;

      【完】

      前端:

      数据赋值之前先清零,动画开始之前先停止;

      定时器转移之前先清除,显隐操作之前先隐藏;

      目录
      目录