网站后台service层controller层测试方案总结

网站后端一般从下往上有Entity层(对应DB table) —> Dao层(对应DB table增删改查各种操作)—> Service层(业务逻辑层,调用dao层和DB打交道) —> Controller层(对应http api urls,调用service)。

前后端分离开发的话,后端必须做到充分的自测,才能保证前后端联调时不出大问题。如果Dao层使用JPA的话,其实不需要测试,除非用错了。那么,针对entity层和service/controller层,后端开发时怎么自测一直是个问题萦绕在我心头。

现在这个问题的两个部分全部找到了答案,有种打通了任督二脉的快感,实际上是察觉到,方法论和工具层面,不管是开发还是测试,是相通的。以往自己的技能图是这一块,那一块,现如今块与块之间融会贯通起来了,点滴积攒外加思索,终归会形成全局观。entity层的测试方案请见上篇博文:构建HibernateUtil测试Entity层代码 本篇会就service/controller层测试给出我认为适合我们项目的解决方案。

首先,我研究了一天半SpringBoot框架里面自带的Test模块。确实,使用MockMvc再配合各种注解可以在unit test里去启动SpringBoot App(或者某个要测试的controller类),然后发送request(可以带参)验证response。然而我们的后台有加session拦截器,不带着合法sessionId过来的request会被deny。接着我又去研究怎么样先登录,拿到服务器种的SessionID,然后怎么样带着这个sessionId继续后续的api测试。没有成功…不知道是框架不支持,还是我不会用。

其次,我的api没有网上demo里的那么简单,请求/hello然后验证响应里面包含"Hello World"。我的API里要增删改查的,都是要跟数据库打交道的,成功的话也都会反映在数据库表里的。google了很久,发现,就算用mockito把controller依赖的service/dao都Mock出来,也根本达不到我的目的它们都是Mock的啊,所以不会真的去DB里面增删改查啊!沮丧…

周五开完早早开完周会,准备跑路,突然灵光一闪,可以用抓包工具直接发请求的呀,篡好request header,篡好参数json串,先去请求login api,reponse里面会有setCookie:JSESSIONID=…什么的,把这个合法的JSESSIONID拷贝出来,加到下一个请求的Header里面去就好了。

说干就干,先从浏览器里面登录我们网站,把请求login api的header和参数复制到fiddler,请求成功后,把sessionid加到后面request header里面去,增删改查api调用之后,观察response里的数据和DB表里的数据就成了。最后再测试一些边界输入及错误输入,服务器端能够hold住并且response里有合适的msg,就行了!

有一点比较神奇的是Fiddler里发GET请求,如果还带参数的话,参数必须直接接到url后面去,即?param1=1&param2=2这样子,不能以json串的形式放在Body里。

还有个点比较疑惑,fiddler里面HTTP版本必须选择1.1,不然服务端不认,返回505(即版本不支持),Why??难道我们的服务端有限定HTTP版本还是咋地…有待挖掘…

所以,针对我们的网站项目,fiddler或者任何抓包工具就可以完全做到后端controller/service层的自测了。效率很高,简单。我想,好的解决方案往往都不是复杂的,而是简单的。

不过实际上,要想在代码层面实现controller/service层的测试,使用apache的HttpClient再配合unit test就可以了,加上这些unit tests更稳妥些,任何时候想运行就运行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章