目前互联网金融火的一塌糊涂,基于互联网金融平台的自动化测试的项目也是如火如荼的进行。笔者手头上负责一个p2p项目的测试框架开发,因此如何设计一套有效的测试框架也成为工作所需和互相交流测试经验的必须。
这个网站的后台主要是php和java, 也就是说,一些基础的服务,如充值提现,投标起息还款,是采用spring mvc的框架来写的,然后php来调用java的API,java平台通过intercepter将php 传递过来的http请求映射到对应的controller,controller再通过map映射到对应的服务和实现。
简单来说网站框架就类似如下:
网站一些基本的业务如注册登录,用户中心,投资、红包等等由用户前台触发php调用,一些活动、红包、礼品券等等由后台触发php调用,充值提现投资起息还款由java平台实现。
基于这样的平台的自动化测试框架选型的时候,笔者考虑过以下几种:
一种是采用基于selenium,集成thinkphp的框架来写。主要的原理就是利用selenium的firefox插件来录制,页面上的html元素和javascript脚本,然后做2次封装将这些录取到的元素和js封装成一个个的标准对象,保存到标准对象库,然后再添加一些数据库的数据准备和数据清理函数,以及数据库增删改查语句。
然后在引擎脚本中,引用和调用这些对象的方法,类似如edit,type等等,然后就在页面跳转的时候加上驭循环和一些判断,检测页面元素的值是否存在,或者是检测一些方法返回值,或者是采用断言来处理数据库查询到的结果和页面上返回的结果做匹对,可以在以selenium为基本的框架的时候,引入thinkPHP或者YII框架加快开发脚本速度。
另外一种是采用QTP方式来使用,其基本原理也和采用selenium原理大同小异,唯一的差别就是QTP提供了一个很好和强大的基本类库,以及一个很好的对象识别机制obeject Spy,QTP的基本类库里面基本什么都有,java,.net, web,乃至于dephi……
在识别对象的时候可以直接通过java里面的类来映射,也可以直接用web相关类库里面的类,甚至是windows平台类……QTP提供了多种识别方式以帮助定位对象,这样只用修改少量的对象属性,在回放脚本和编辑核心代码的时候,就可以起到事半功倍的效果,但是QTP也有缺点,就是对于Js的处理不方便,还有就是时刻需要启动QTP,而不能和一些开源测试框架特别是java开源项目,来实现自动部署测试用例和自动打包的集成。
ruby +watir 的原理和selenium也是类似,也是一种基于WEB GUI的自动化测试框架,笔者研究甚少,也就不多言了。
但是由于p2p行业的特性,这些基于web的自动化测试框架有很多不适合的地方,跟投资充值提现相关的这些相关的功能,比较在乎的不仅仅是页面上的一些元素功能的显示,更关心的是这个数据的正确性。
如果采用基于GUI的方式做自动化测试,个人感觉针对页面元素的识别和校验往往并不能反映数据正确性,而在处理页面元素异常的时候,也往往无法针对复杂业务逻辑和数据做较强的处理和效益,而且GUI是模拟人工处理,在执行效率上面,也是效果较差,而且如果出现某个页面元素无法识别或者异常,有可能中断整个页面的处理,在分析代码覆盖率的时候,基于web的方式也不是那么容易分析。
目前的这个项目,java向PHP平台提供的主要是基于HTTP协议的restful应用,之所以采用restful,而不用webservice来处理传输数据相关,是因为webservice即便是采用json而不是xml来处理传输数据,相比较restful也显得较重,json还需要加密解密解析、序列化什么的,而在 restful 里面直接就可以通过 http 请求对资源进行操作。
因此笔者觉得还是从controller层直接进行接口测试比较直接有效,又考虑到 spring框架里面提供了mock http请求的方法,而web UI的正确性相对于后台业务数据正确性的优先级就没有那么高了,而spring的测试框架里面虽然可以通过断言controller层返回的ModleAndView对象校验controller的正确性,即通过接口测试来效益结果,但是如果controller层后面的对象 太多的话,一旦出现问题也不便于排错。
因此基本的测试框架思路就是采用spring mvc提供的mock restful的工具类,然后引入断言机制和数据库处理,来逐个controller分析业务逻辑的正确性和数据正确性。而sping MVC本身也提供了一套测试框架,可以通过服务端测试和客户端测试分别来测试。
服务端测试在使用spring mvc测试框架之前,可能采取类似如下代码:
-
@Test
-
public void serverSample() {
-
MockHttpServletRequest request = new MockHttpServletRequest();
-
ModelAndView mav = new sampleController.function(parameters);
-
ModelAndViewAssert.assertViewName(mav, user/view);
-
ModelAndViewAssert.assertModelAttributeAvailable(mv, user);
-
}
-
}
采用服务器端测试后,可以采用如下两种方法:
-
standalone:
-
public class ServerTest {
-
@Autowired
-
private MockMvc mockMvc;
-
@Before
-
public void init() {
-
SampleController sample = new SampleController();
-
mockMvc = MockMvcBuilders.standaloneSetup(SampleController).build();
-
}
-
}
集成:
-
public class ServerTest {
-
@Autowired
-
private WebApplicationContext wac;
-
private MockMvc mockMvc;
-
@Before
-
public void init() {
-
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
-
}
-
}
测试:
-
@Test
-
public void testSample() throws Exception {
-
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(/user/1))
-
.andExpect(MockMvcResultMatchers.view().name(user/view))
-
.andExpect(MockMvcResultMatchers.model().attributeExists(user))
-
.andDo(MockMvcResultHandlers.print())
-
.andReturn();
-
Assert.assertNotNull(result.getModelAndView().getModel().get(user));
-
}
以上是采用spring MVC的服务端测试方法,至于客户端则有几种方法,
1.通过jetty启动容器,真实映射到controller层实现;
2.使用spring boot测试
3.使用mock service server测试,第三种方式基本上属于使用resttemplate来测试客户端比较好的方法;
即先通过MockRestServiceServer创建RestTemplate的Mock Server,然后添加客户端请求断言,判断客户端请求的断言是否正确,3、添加服务端响应,检查服务器端相应是否正确。
客户端相关代码在网络上也有很多资源,因此也就不再赘叙,这里主要是提供一种基于spring mvc框架和基于restful应用如何测试controller层的思想。
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。