我们自己用java写接口自动化测试框架或者做个接口自动化测试平台的话,是需要自己进行相关的请求的,因此我们需要简单的封装下httpclient,我新建了一个http工具类,将get方法和post方法进行了一个简单的封装。

如果是开发的话,比如APP开发,无论是iOS还是Android,是需要将数据请求进行十分严密的封装的,因为需要对各种网络状态,请求状态做相应的判断处理,因为需要通过这些判断来做出相应的UI交互界面来给用户提示,那么我们做接口测试的话是不需要这么严密的,因为测试的前提就是要保证测试环境的稳定,我们只考虑接口在正常的访问下通过对传参的各种控制来判断接口是否做出了正确的数据传输。

前几篇已经记录下了简单的HTTPClient的get和post请求,下面是对它们进行了个简单的封装,使之更容易被我们使用

package com.httpclientget;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Map; import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; public class HttpUtil { //连接池
private static PoolingHttpClientConnectionManager connectionMgr;
//超时时间
private static final int MAX_TIMEOUT = 7000; private static RequestConfig requestConfig;
static{
//设置连接池
connectionMgr = new PoolingHttpClientConnectionManager();
//设置连接池大小
connectionMgr.setMaxTotal(100);
connectionMgr.setDefaultMaxPerRoute(connectionMgr.getMaxTotal()); RequestConfig.Builder configBuilder = RequestConfig.custom();
//设置连接超时
configBuilder.setConnectTimeout(MAX_TIMEOUT);
//设置读取超时
configBuilder.setSocketTimeout(MAX_TIMEOUT);
//设置从连接池获取连接实例的超时
configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT); requestConfig = configBuilder.build(); }
/**
* GET 请求 带输入参数
* @param Url 请求host地址
* @param params 参数
* @return
*/
public static String httpGet(String Url,Map<String, Object>params)
{
//返回结果
String result = null;
//拼接url
StringBuilder builder = new StringBuilder(Url);
if (Url.contains("?")) {
builder.append("&");
}else{
builder.append("?");
}
int i=0;
for (String key : params.keySet()) {
if (i != 0 ) {
builder.append("&");
}
builder.append(key);
builder.append("=");
builder.append(params.get(key)); i++;
}
String apiUrl = builder.toString();
//创建client
HttpClient client = HttpClients.createDefault(); try {
HttpGet get = new HttpGet(apiUrl);
HttpResponse response = client.execute(get);
//获取请求状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println(statusCode); HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity,"UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* POST 请求
* @param url 请求url
* @param params post提交参数
* @return
*/
public static String httpPost(String url,Map<String, Object>params)
{
HttpClient client = HttpClients.createDefault();
String result = null;
try {
HttpPost post = new HttpPost(url);
//添加post提交参数
ArrayList<NameValuePair> pairList = new ArrayList<NameValuePair>();
for(Map.Entry<String, Object> entry:params.entrySet())
{
NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());
pairList.add(pair);
} post.setEntity(new UrlEncodedFormEntity(pairList,"UTF-8")); HttpResponse response = client.execute(post);
//获取状态码
int statueCode = response.getStatusLine().getStatusCode();
System.out.println(statueCode); HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity);
} } catch (Exception e) {
e.printStackTrace();
}
return result;
}
}

做个简单的测试:

               HttpUtil util = new HttpUtil();
Map<String, Object> params = new HashMap<String, Object>();
params.put("q", "good");
params.put("salt", "1496238482428");
params.put("sign", "02E15CDAF871B698FE04EE32FD2CF155");
params.put("from", "en");
params.put("appKey", "7743eee7f7e11d75");
params.put("to", "zh-CHS"); String result = util.httpPost(urlStr, params);
System.out.println(result);

输出结果:

{
"tSpeakUrl": "https://dict.youdao.com/dictvoice?audio=%E5%A5%BD&le=auto&channel=7743eee7f7e11d75&rate=4",
"web": [
{
"value": [
"好",
"善",
"商品"
],
"key": "Good"
},
{
"value": [
"公共物品",
"公益事业",
"公共财"
],
"key": "public good"
},
{
"value": [
"干的出色",
"干得好",
"好工作"
],
"key": "Good Job"
}
],
"query": "good",
"translation": [
"好"
],
"errorCode": "0",
"basic": {
"us-phonetic": "ɡʊd",
"phonetic": "gʊd",
"uk-phonetic": "gʊd",
"explains": [
"n. 好处;善行;慷慨的行为",
"adj. 好的;优良的;愉快的;虔诚的",
"adv. 好",
"n. (Good)人名;(英)古德;(瑞典)戈德"
]
},
"speakUrl": "https://dict.youdao.com/dictvoice?audio=good&le=auto&channel=7743eee7f7e11d75&rate=4"
}

如果不需要传入参数,把第二个传入的参数置为空即可,这只是简单地封装了下,在后续要写的自动化测试框架我们可能还是要加入各种各样的判断以及日志输出,毕竟测试最重要的还是断言等这样的测试结果。

java 接口自动化测试之数据请求的简单封装的更多相关文章

  1. Java接口自动化测试之集成MyBatis和MySQL (五)

    pom.xml新增dependency <dependency> <groupId>org.mybatis</groupId> <artifactId> ...

  2. (转)接口自动化测试之http请求实践总结

    一.接口测试的基本思路 1.确定要测试接口的请求类型.接口是get请求还是post请求. 2.确定接口的参数.需要传输的参数有哪些,类型分别是什么,都有哪些要求等. 3.按照参数要求构造请求需要的参数 ...

  3. Java接口自动化测试之TestNG测试报告ExtentReports的应用(三)

    pom.xml导入包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  4. 【转】JAVA接口自动化测试之一个测试方法对应多条测试数据的实现方式

    一.痛点:一条测试数据对应一个测试方法 前面的章节中我们已经写代码实现了登录接口的处理调用,但是一个接口往往是需要多条测试用例才能完整的覆盖到每一种情况. 针对于单接口多条测试用例需要执行的情况,该如 ...

  5. Java接口自动化测试之HTTPClient学习(四)

    pom.xml  文件中dependency <dependencies> <dependency> <groupId>org.testng</groupId ...

  6. Java接口自动化测试之TestNG学习(二)

    在maven项目的pom.xml文件中导入TestNG <?xml version="1.0" encoding="UTF-8"?> <pro ...

  7. Java接口自动化测试之Maven项目的创建(一)

    这里使用Idea创建Maven项目, 过程非常简单, 装好JDK和Idea 1. 安装完后,打开Idea, 选择File→New→Project, 如图 2. 选择maven, 点击Next, 如图 ...

  8. python接口自动化(post请求)

    python接口自动化(post请求) 一.post请求的作用:新增资源 二.data格式的参数请求(data是字典对象) #1.导包 import requests #2.调用post方法 #请求的 ...

  9. python接口自动化(get请求)

    python接口自动化(get请求) get请求的目的:查询资源 一.导包 二.请求的URL 三.请求的参数 四.获取请求的URL 五.获取响应的状态码 六.获取响应的本文信息 #导包 import ...

随机推荐

  1. Network | router & switch

    路由器 A router is a device that forwards data packets between computer networks. This creates an overl ...

  2. OpenGL step to step(2)

    这是一个类似于地球绕太阳旋转的demo 原有的例子是用键盘接受事件,我做了修改,使用了timer把他变成一个动态旋转的 #import <Foundation/Foundation.h> ...

  3. Android View源码解读:浅谈DecorView与ViewRootImpl

    前言 对于Android开发者来说,View无疑是开发中经常接触的,包括它的事件分发机制.测量.布局.绘制流程等,如果要自定义一个View,那么应该对以上流程有所了解.研究.本系列文章将会为大家带来V ...

  4. 表现层 JSP 页面实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 easyUI 实现系统的前端页面. 1.2 实验知识点 easyUI JavaScript html 1.3 实验环境 JDK1.8 Eclipse ...

  5. Controller 层实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 Spring MVC 框架实现 Controller 层以及一些辅助类的实现. 1.2 实验知识点 Spring MVC 框架 1.3 实验环境 JD ...

  6. [Javascript] Await a JavaScript Promise in an async Function with the await Operator

    The await operator is used to wait for a promise to settle. It pauses the execution of an async func ...

  7. 日志打印longging模块(控制台和文件同时输出)

    在把日志写入文件的同时在控制台输出 示例代码如下: #coding=utf-8 import logging import time import os dir = os.path.dirname(o ...

  8. Oracle pipe

    初次接触到Report ,看到了它背后复杂的SQL操作, 首先看到了一个Pipe,先了解下PIPE的用法: 关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必 ...

  9. 轻松搞定RabbitMQ(四)——发布/订阅

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48729479 翻译地址:http://www.rabbitmq.com/tutorials ...

  10. 李洪强iOS开发之带placeHolder的Textview

    李洪强iOS开发之带placeHolder的Textview  01 - 创建工过程,定义全局属性,遵守textview的代理协议  02 - 添加一个textview和一个label 03 - 实现 ...