当前位置:文档之家› Java接口自动化测试实践

Java接口自动化测试实践

Java接口自动化测试实践众所周知,在现在这个移动互联网越来越发达的时代,瘦客户端和胖服务端的要求下,服务端的测试也变得越来越重要。

而服务端的实现通常是通过HTTP请求的API和服务来实现的,而服务由于实现起来比较复杂,所以大多公司使用的还是HTTP请求的API接口来处理底层数据。

在前面的博文中我们讲过了如何使用PHPUNIT框架和python的urllib2和reqests模块,来进行接口自动化测试。

可是很多同学比较善长java,如果想用这个来做接口自动化测试的化,还是有点儿麻烦的。

因为没有具体的函数,需要利用HttpClient来模拟HTTP请求,并对接口的返回值进行处理才行。

下面我们就讲解,如何用java来封装对HTTP请求的API来做自动化测试:一、GET方式的请求Get类请求分为有参数和无参数两种情况,如果没有参数,则直接通过接口调用地址进行请求,接收返回结果;如果有参数,则把参数添加进来,对请求的结果进行筛选。

码后,就成为%式样的字符串method.setQueryString(URIUtil.encodeQuery(params));client.executeMethod(method);BufferedReader reader = new BufferedReader(newInputStreamReader(method.getResponseBodyAsStream(),"utf-8"));String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();} catch (URIException e) {System.out.println("执行HTTP Get请求时,编码查询字符串“" +params + "”发生异常!");} catch (IOException e) {System.out.println("执行HTTP Get请求" + url + "时,发生异常!");} finally {method.releaseConnection();}return response.toString();}代码分析:(1)新建HttpClient和GetMethod,通过GetMethod来创建URL请求相关的URL 和参数,然后通过HttpClient发起HTTP请求,接收返回结果。

(2)如果接口请求的参数不为空,则通过setQueryString()将参数和URL拼接到一起。

(3)通过HttpClient的getResponseBodyAsStream()来获取请求结果,并将结果添加到StringBuffer里面,最后以字符串的形式来返回。

二、Post 类请求接口Post请求都是向服务器提求表单的,所以要封装相应的HTTP请求头,并且把相应的参数添加到请求中,具体代码如下:}//设置Http Post数据if (params != null) {NameValuePair[] postData = new NameValuePair[params.size()]; i=0;for (Map.Entry entry : params.entrySet()) {postData[i] = new NameValuePair(entry.getKey(), entry.getValue()); i++;}method.addParameters(postData);}try {client.executeMethod(method);if (method.getStatusCode() == HttpStatus.SC_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream())); String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();}代码分析:(1)新建HttpClient和PostMethod,通过PostMethod来创建URL请求相关的URL和参数,然后通过HttpClient发起HTTP请求,接收返回结果。

(2)通过addRequestHeader()将HTTP请求的头,添加到HttpClient中,从而达到对HTTP请求头的封装。

(3)通过NameValuePair来组织接口数据,通过addParameters()将参数添加到HTTPClient中。

(4)通过HttpClient的getResponseBodyAsStream()来获取请求结果,并将结果添加到StringBuffer里面,最后以字符串的形式来返回。

三、返回值结果转换成JSON通过我们上面的两个函数的调用,我们就可以通过java来进行HTTP请求的接口测试,可是我们通常见的接口返回值是Json字符串。

这样可以通过关键字获取相应的字段值,而我们模拟请求的接口是字符串,如果内容太多的话,处理起来相当费劲,所以我们需要借助于其他的函数来处理一下返回值。

具体代码如下:public static String GetJsonValue(String result,int index,String key){int indexloc,indexkey;String newstr;indexloc=result.indexOf("[");indexkey=result.indexOf(key);//判断Data域的内容if (( indexloc>indexkey || indexloc==-1) & index==0){JSONObject jsonObj = JSONObject.fromObject(result);return jsonObj.getString(key);}else{newstr=GetNPro(result,index);return GetJsonValue(newstr,0,key);}}public static String GetNPro(String str,int n){Matcher slashMatcher = pile("\\{").matcher(str);int mIdx = 0;while(slashMatcher.find()) {if(mIdx ==n){break;}mIdx++;}str=str.substring(slashMatcher.start(),str.length());return str.substring(0, str.indexOf("}")+1);}通过上面的两个函数,我们可以将字符串转化成Json字符串,并能通过关键字来提取对应数据。

如果要提取的数据是第一层里面的,可以直接提取,如:GetJsonValue (jresult,0,”error”);如果要提出的数据在data中或是更深的json中,则需要指示是第几个数据了,数据以1开始计数,如:GetJsonValue (jresult,2,”name”) 表示获取第二个数据项的name 字段的值。

借助于这两个函数,我们可以根据Key来提取出需要的数据,进而去做我们测试用例的判断,完成对接口的自动化测试。

当然我们还可以根据自己业务的需要,去封装获取你需要的数据的函数,以减少工作量。

四、封装的函数实践经过上面我们封装的调用函数,结果处理函数,就可以通过java代码来完成对HTTP 请求的API的调用,数据的获取等功能,下面我们实践一下:public static void main( String[] args ){// Get接口调用String url="/deal/list";String params="?v=1";String apiresult=GetRequests(url,params);System.out.println("errno:"+GetJsonValue(apiresult,0,"errno"));//获取接口返回代码System.out.println("name:"+GetJsonValue(apiresult,3,"name"));//获取第三个项目的项目名称//Post接口调用String posturl="/user/login?v=1";Map map = new IdentityHashMap ();map.put("identity", "183****8905");map.put("password", "**********");String poresult=PostRequests(posturl,map,null);//获取登录的用户帐号昵称System.out.println("Name:"+GetJsonValue(poresult,1,"name"));}执行上面的调用主函数,查看输出结果,是否和预期是一样的?java功能强大就强大的其封装功能,你可以根据自己的需要去开发相应的jar包或是平台。

最后我们总结一下:在我们的测试开发工作中,还是先考虑开源的框架,现成的包或是模块,以最少的工作量来快速解决问题。

有些儿时候为了保持公司的平台或是框架的一致性,还需要统一语言的,此时就可以考虑封装自己的框架或是函数。

相关主题