MongoDB 测试组件——测之重器(8)

发表于:2017-8-11 15:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:张俊卿    来源:51Testing软件测试网原创

分享:
 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软件测试网获电子工业出版社和作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
DbSlim数据库测试组件——测之重器(7)
22/2<12
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号