2.8 Web Service:REST 测试组件
关于用REST 测试Web Service 组件,也有外国友人开发了一个FitNesse 组件RESTFixture,详见https://github.com/smartrics/RESTFixture。如果查看它的源代码,会发现其源代码晦涩难懂,而且REST 组件需要对公司项目做特别订制。比如想用REST 的Post 方法去测试公司项目Web Service 的登录功能,需要在Post 的消息头加入Cookie,甚至SSL 验证等,而这些都需要自己去编写,开源组件无法覆盖到你的需求。
那怎么办呢,前面三个组件都是告诉大家如何把别人开发好的拿来用,本节讲解如何编写测试组件。
我们以1.6 节Web Service 的测试案例为例,讲解如何实现测试组件。
1.创建一个包,可以按照下面代码的第一行package 所示去命名,再创建一个Java 类,可以命名为RESTDriver。
以下是实现代码。
package com.junqing.qa.REST;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.NestedNullException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.io.IOUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.codehaus.jackson.map.ObjectMapper;
public class RESTDriver {
HttpClient client = HttpClientBuilder.create().build();
private String _uri;
private String _content = "";
private String _contentType = "";
private HttpEntity entity;
public void setUrl(String uri){
_uri =uri;
}
public void setContent(String content){
}
public void setContentType(String contentType){
}
public void get() throws ClientProtocolException, IOException {
HttpGet httpGet = new HttpGet(_uri);
HttpResponse response = client.execute(httpGet);
entity = response.getEntity();
}
public void post() throws ClientProtocolException, IOException{
HttpPost httppost = new HttpPost(_uri);
httppost.addHeader("ContentType", _contentType);
httppost.setEntity(new StringEntity(_content));
HttpResponse response = client.execute(httppost);
entity = response.getEntity();
}
public String getResponse() throws IllegalStateException,
ClientProtocolException, IOException{
InputStreamReader json = new InputStreamReader(entity.
getContent(),
Consts.UTF_8);
String response = IOUtils.toString(json);
return response;
}
public String getValue(String key) throws IOException {
/*
* 这一段代码是用来给查询JSON 数组的key 加上小括号的。因为要查询数组,
* key 只能这样写(array)[0],因为PropertyUtils 只认识这样的key。
*/
String[] keys = key.split("\\.");
for (int i = 0; i < keys.length; i++) {
if (keys[i].contains("[")) {
String keyWord = keys[i].split("\\[")[0];
String NewkeyWord = "(" + keyWord + ")";
key = key.replace(keyWord + "[", NewkeyWord + "[");
}
}
Object object = null;
try {
ObjectMapper mapper = new ObjectMapper();
Object jsonObj = mapper.readValue(getResponse(), Object.
class);
object = PropertyUtils.getProperty(jsonObj, key.trim());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NestedNullException e) {
e.printStackTrace();
}
return String.valueOf(object);
}
}
这个类主要提供了REST 的post 和get 方法去访问Web Service,此外还有一个工具方法getValue,主要用它从Web Service 的JSON 中取值。此类所依赖的jar 包如图2-8-1 所示。
图2-8-1 Web Service 组件依赖jar
这个类具体的使用方法请参考1.6 节,代码已经写在qing-automation框架里了,见https://git.oschina.net/xhyspring/qing-automation。本类所依赖的jar 包可从此框架的lib 文件夹里复制。
这个类提供了最常见的post 和get 方法,并没有提供登录获得的Cookie、SSL 验证等特殊方法,以及put 和delete 等不常用方法,如果你的项目正好遇到了这些,可以在百度中搜索解决方案。
本章到此结束,最后,再分享给大家一个FitNesse 的开源测试组件列表,见http://www.FitNesse.org/PlugIns,如果此列表中有你需要的组件,那么读完本章案例后,你应该知道如何去把它们集成到项目里。
最重要的是,希望大家读完本章后,能知道如何开发测试组件。这样,自动化测试框架的测试功能才能越来越强大。只有强大的测试功能,才能吸引更多的角色(包括开发人员)去使用你的框架编写测试案例。
作业:
注意以下这句代码。
PropertyUtils.getProperty(jsonObj, key.trim());
下面所示的JSON:
{"
firstName": "cyra",
"lastName": "richardson",
"address": {
"streetAddress": "1 Microsoft way",
"city": "Redmond",
"state": "WA",
"postalCode": 98052
},
"phoneNumbers": [
{
" 电信": "425-888-8888"
{
" 移动": "425-777-9999"
}
]}
可以用“phoneNumbers[0]. 电信” 得到425-888-8888, 可以用“phoneNumbers1. 移动”得到425-777-9999。要留意这种类似XPath 取值的方式。此外,大家也可百度“JOSNpath”研究一下,它也是用来从JSON 中取得想要的值的。
本文选自《测之重器——自动化测试框架搭建指南》第二章,本站经电子工业出版社和作者的授权。
版权声明:51Testing软件测试网获电子工业出版社和作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。