本篇用以记录个人项目中单体测试及联合测试时对bug的定位和部分修改过程
怎么办呢?先直接从表面入手,F12打开控制台定位到这个性别元素。
可以看到是通过一个三目运算符对性别代码sex_code进行判断;1为男性,否则为女;逻辑还蛮清晰的。
以防万一,再去查阅原型设计:
好像没什么不对哦,和html中的逻辑相对应。唯一不确定的是性别“男”的约束很强,而性别代码只要不是1的都会显示为“女”,问题是不是在这里?
那来康康前端收到的数据是否有错:
按理说前端会接收到一个学员类型的对象,内含各种信息,包括性别代码sex_code;打开控制台查看相关接口返回的信息:
果然问题出在这里,sex_code字段为空;当然会判断成女性。
根据调用的接口,一直查询到数据访问层xml文件:
我们发现这个sql语句中缺少sex_code字段,虽然不会影响整个查询流程,但是会导致查询结果出错。
在查看全体教师信息时,发现同一位教师信息出现了三次。
教师在教师表中是有唯一标识的,同一条信息不应该出现多次;依据经验应该是在查表时选错表了。
为排除前端可能出现的错误,先去控制台查看前端返回数据:
查看前端返回数据后确定返回的数据列表中包含了三组完全相同的教师信息。同样追溯到xml文件:
我们发现SQL的查询语句中左连了两张表;问题可能出现在这里。
去康康这两张表是什么玩意儿哦~
表T01_PROJECT_BANCI是某一个项目和这个项目对应的班次的关联表,与teacher没有太大关系;
表T07_PROJECT_TEACHER某一个项目和这个项目对应的老师的关联表,详细看看:
在数据库中查看这张表的内容,发现问题出在这里。。。
这张表中同一个老师和三个不同的项目产生了关联,所以左连的时候就左连了三次。。。
解决也很简单,在查询语句中加distinct
去重就好了,只要有一个字段不同,结果就会保留下来。
在前端页面查看系统消息列表,发现有一条8月1日发布的消息:
选择发送时间为8月1日再次进行查询:暂无相关数据???
什么鬼哦。。。打开控制台:这条消息的发送时间确实是8月1日啊。。。
再去数据库里看看:
???什么情况???怎么数据库里的是7月31日。。。查看日志,确定后端传值没有错误。
日志显示传值与数据库一致;怪不得查不到,那再去前端试试。
选择日期7月31日进行查询:
果然是这样,那么后端是没有什么大问题的;问题就出在前端对日期格式的显示上。
多录入几组数据进行测试:
发现数据库中的日期与前台显示的日期相差12小时。。。问题大致明了了
一大早准备联测得时候突然发现用户反馈界面无法进入。。。
打开控制台。。。啊哦,居然有报错。。。
定位到报错的前端代码:
打开前端代码,发现是一条if语句引发的错误,究竟是怎么回事呢?
前面控制台报错说是:
应该说是这个list的suggestions的length为空;去数据库里看一下这个suggestions是什么?
suggestions就是测评表中的一个字段,表示评价的信息内容。
查看数据库发现有一行数据的suggestions字段为空。。。
我们回看那条if语句:
if($scope.list[i].suggestions.length > 15){
scope.list[i].suggestions = $scope.list[i].suggestions.substring(0,15) + "...";
}
很典型的一个没有对异常条件进行判断的一个bug,没有考虑到suggestions内容可能为null,直接获取其length会获取不到而报错。
在js中加一个判断即可解决:
在这里注意一下,“”
和null
是不一样的;
加判断时不可以直接写if($scope.list[i].suggestions.length == 0)
;
当数据库中的suggestions字段为空null
时,依然无法获取其length,null相当于没有创建相应的对象,没有分配内存(个人观点);而只有suggestions字段为“”
时,才能获取其length=0;
所以要将判断写成if($scope.list[i].suggestions == null || $scope.list[i].suggestions == '')
才能保证程序不会出现问题。
问题描述:在修改宿舍的状态时(正常–>维修中),会错误地将将房间类型修改为套间。
现在以1112号宿舍为例,类型为标间,状态为正常,可进行操作为修改、房间维修、暂时占用。
点击 “ 房间维修 ” 超链接,数据改变:
房间状态符合预期,显示为:维修中;但是房间类型出现错误。
在多次实验后发现,任何情况下点击 “ 房间维修 ” 超链接,房间类型都会错误的更改为套间。
查看前端页面:
前端在点击 “ 房间维修 ”链接后,向后台传了三个参数:宿舍楼id、房间号、房间状态。
房间状态的值来自调用这个方法传入的参数id。
再去查看后台sql语句,因为代码复用,更新房间信息和更改房间状态调用了同一段代码:
其中这条语句对房间类型字段进行了重新赋值。。。也就是说在更新房间状态的时候,会重设房间类型字段。
但是在更改房间状态时,前端并没有传递房间类型这个值;在SQL语句中sushe_classify
字段被重设为null。
问题很明显了,想都不用想,前端列表展示房间类型字段所用的三目运算符将null直接判断为 “ 套间 ”。
其实整个过程的问题就出在:代码复用时没有进行必要的判断。
解决:
既然更改房间状态时不需要改动房间类型字段,那么是不是可以直接删掉对sushe_classify
字段设值的SQL语句?
不行!!!因为在更新房间信息时会对sushe_classify
字段进行重设。对应SQL语句仍有用。
那怎么办? 再写一个方法?那代码复用不就没有意义了。。。
这两个方法在前端的调用区别在于:是否传递了sushe_classify
的值,即前端传递来的sushe_classify
是否为空?
那么可以在SQL语句中加个判断,MyBatis是支持的:
可以思考一下用最原始的JDBC代码怎么完成对应的业务逻辑,是否更加复杂。
问题解决。。
未完待续。。。