分享

后端bug定位的基本流程(实战实战实战!)

 程序员小谭 2022-07-06 发布于四川

大家好,我是小谭。

上周我更新了一篇文章,对判断前端和后端bug扫了个盲。有的小伙伴读完后意犹未尽,并且不太明白这块的内容。

于是,我就着一个实际的项目和实际的例子,再跟大家再盘一次——后端bug定位的基本流程。

发起请求

顾客来到餐厅点餐(在页面操作,向后端发起请求)

项目介绍:宠物医院。用户可使用预约医生、浏览文章、商城购物等功能。项目介绍:分享一份适合写进简历的软件测试项目

结果:访问/reservation/doctorCanReserve页面查看预约医生时,查询结果为空。

这是实际工作中很常见的一个例子,当页面没有数据或者数据有误(实际结果和期望结果不一致),我们需要判断它到底有没有问题。

浏览器中打开F12,刷新页面,拿到url路径doctorCanReserve

Controller层:处理前端请求

Controller是服务员,顾客点什么菜(发起的哪个接口请求),菜上给几号桌(走到后端的哪个逻辑),都是ta的职责

打开项目代码,在IDEA中全局搜索(Edit->Find->Find in Path)上一步复制的url路径doctorCanReserve,定位到controller层代码。

controller的代码一般较为简单,也容易理解。在本段代码中,Controller层做了一些统计(88行定义对象,90-94循环运算,95组装统计结果)和if判断(91行判断了数据状态)。

关键内容在代码的第89行,它调用了UserService去获取可预约的医生列表。

@RequestMapping在Spring MVC中常用来映射请求:指定控制器可以处理哪些URL请求

按住ctrl加鼠标左键,跳转到的Service层。

Service层:定义和实现业务

Service是厨师,菜单上的菜全是ta做的(业务逻辑处理,比如求a+b的和);

一般来说,service是逻辑处理的核心代码。如果业务复杂,会写很多代码,例如这样:

但在本例中,UserService没做多少逻辑处理,只是按照MVC的设计,走了这一步。

于是,我们继续向下扒拉,点击左边的图标,跳转到接口实现层ServiceImpl

再按住ctrl加鼠标左键,跳转进入Mapper

ServiceImpl又是什么?

有的项目只使用了service,即service层=service类;有的项目会使用service+serviceImpl,即service层=service类+serviceImpl实现类。

这里需要面向对象的思维去理解它们,但你仍旧可以简单的理解为:前者一步搞定,但不方便拓展;后者虽然多了一步,但拓展性更强。归根到底,它们做着同一件事情——实现接口的内部逻辑。

Mapper:数据库映射

Dao是厨房的小工,和原材料打交道的事情全是ta管(数据的增删查改,比如取a=1,b=2)

此时,你应该想到一个问题:上层代码会处理列表,而列表得有一些数据,而数据一般存放在数据库里面,通过Sql语句进行增删查改。

此处想通,这里便容易理解了,mapper是打通(映射)代码和数据库的关键。

要找到具体的sql语句,需要到resource文件夹下找同名文件:UserMapper.xml。

为了方便跳转,我们可以安装一个IDEA小插件,安装之后左边就会出现跳转的按钮,直接访问对应的xml文件。

mapper.xml:存储sql语句

在mapper.xml里面,便能看到具体的sql语句——他做了一个嵌套查询。

复制sql语句,去数据库里面执行,结果确实没有数据。

然后再拆分sql语句,分别查询嵌套内外的数据。结果,t_reservation有数据,是因为where条件做过筛选,去掉了可预约时间小于今天的数据。如果将reserveDate的值改到今天之后,web页面就能显示可预约医生列表了。

最后

本文拆解了一个简单的案例,只要你按照上面的这种思路操作几次,便能稍微熟悉常见的MVC系统。然后,在你后续一次次的练习和总结中,你会发现,很多不怎么复杂的业务系统,也就是增删查改而已,不然为什么有的开发大哥总会调侃自己是CRUD工程师呢。

原理如此,收藏这张图,没事的时候就拿来捋一捋吧。

另外,本文配套项目链接在这里。价优质好,可按需拍单:

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多