写点什么

HTTP 接口测试基础【FunTester 框架教程】

用户头像
FunTester
关注
发布于: 2 小时前

今天继续编写 FunTester 测试框架的教程,主要内容是 HTTP 接口测试基础,分为请求(GET、POST、PUT 等)、请求头、cookie、响应、JSON 以及资源释放。


之前的 FunTester 教程文章以及相关文章比较凌乱,没有进行较好的整理,我都是学到哪写到哪,欢迎有兴趣 Tester 一起交流。下面是一些相对基础的文章,如果想了解实现细节的可以读一读,如下:



后面这俩用的不多,可以读一读,HTTP proxy 主要用来防爬虫用的,HTTP 异步请求我会在最近的文章中分享 HTTP 异步请求在性能测试中的使用。



PS:下面代码使用 Java 语言演示。

准备工作

首先得创建一个 Java 类,然后继承一下com.funtester.httpclient.FunLibrary,再添加一个main方法。


package com.funtest.study;
import com.funtester.httpclient.FunLibrary;
public class FunTester extends FunLibrary {
public static void main(String[] args) {
}}
复制代码

请求

HTTP 协议的请求相对于一个对象,我用了org.apache.http.client.methods.HttpRequestBase这个对象作为基础类,这也是 HttpClient 自带的类。


HTTP 请求方式的不同,又分为不同的实现类。例如 HTTPget、HTTPpost、HTTPPUT 等。其中最常用的就是 GET 和 POST,本教程也主要以这两种请求对象来演示 FunTester 测试框架的使用。

GET

GET 请求比较简单,传参的话只有一种方式,这里FunTester封装了一个没有参数的方法和一个 JSON 格式的请求参数。


源码就不赘述了,分享两个方法如何创建 HTTPget 请求对象。



public static void main(String[] args) {
String url = "http://localhost:12345/m/info";//请求地址 JSONObject params = new JSONObject();//参数 params.put("name", "FunTester"); params.put("uid", 123456); //无参创建HTTPget对象 HttpGet httpGet = getHttpGet(url);
//有参创建HTTPget对象 HttpGet httpGet1 = getHttpGet(url, params);
}
复制代码

POST

POST 请求传参稍微多一点,主要是因为 POST 请求参数放在 requestbody,参数分成两种一种:JSON/text、form 表单,在 POST 请求表单格式默认使用x-www-form-urlencoded格式的。至于 POST 请求上传文件的,大家可以参考httpclient上传文件方法的封装,工作中用到太少了。


    public static void main(String[] args) {
String url = "http://localhost:12345/m/info";//请求地址 JSONObject params = new JSONObject();//参数 params.put("name", "FunTester"); params.put("uid", 123456);
//无参创建HTTPpost对象 HttpPost httpPost = getHttpPost(url); //json/text格式参数 HttpPost httpPost1 = getHttpPost(url, params.toString());
//json/text格式参数 HttpPost httpPost2 = getHttpPost(url, params);
}
复制代码

header

这个相对简单,封装了一个方法com.funtester.httpclient.FunLibrary#getHeader,这里需要一个向请求对象添加 header,是因为工作中一般都是封装好的框架,不会在业务模块处理 header。


下面以 GET 请求演示添加 header:


    public static void main(String[] args) {
String url = "http://localhost:12345/m/info";//请求地址
HttpGet httpGet = getHttpGet(url); //添加header httpGet.addHeader(getHeader("name","FunTester"));
}
复制代码

cookie

首先我建议各位先读一读httpclient处理多用户同时在线,这篇文章中对于 HttpClient 连接池管理器中关于 cookie 的设置。


这里的 cookie,也是用 JSON 数据格式的,FunTester 封装了一个方法用于将 cookie 转成 header,FunTester 只保留了 cookie 中的 key-value。


    public static void main(String[] args) {
String url = "http://localhost:12345/m/info";//请求地址 JSONObject cookie = new JSONObject();//参数 cookie.put("name", "FunTester"); cookie.put("uid", 123456);
HttpGet httpGet = getHttpGet(url); //添加cookie httpGet.addHeader(getCookies(cookie));
}
复制代码

响应

这里 FunTester 测试框架提供一个基础的方法com.funtester.httpclient.FunLibrary#getHttpResponse,请求参数是org.apache.http.client.methods.HttpRequestBase,改方法会把响应封装成 JSON 对象。如果响应非 JSON 格式,会转成 JSON 格式。具体的代码如下:


    /**     * 根据解析好的content,转化{@link JSONObject}对象     *     * @param content     * @return     */    private static JSONObject getJsonResponse(String content, JSONObject cookies) {        JSONObject jsonObject = new JSONObject();        try {            if (StringUtils.isEmpty(content)) ParamException.fail("响应为空!");            jsonObject = JSONObject.parseObject(content);        } catch (JSONException e) {            jsonObject = new JSONObject() {{                put(RESPONSE_CONTENT, content);                put(RESPONSE_CODE, TEST_ERROR_CODE);            }};            logger.warn("响应体非json格式,已经自动转换成json格式!");        } finally {            if (cookies != null && !cookies.isEmpty()) jsonObject.put(HttpClientConstant.COOKIE, cookies);            return jsonObject;        }    }
复制代码


这里我会解析响应 header 中的set-cookie字段,把所有信息的 key-value 转成 JSON,存放在响应 JSON 的最外层 key=cookie。同时我会将响应的 HTTPcode 存放在响应 JSON 最外层 key=FunTester 中,这两个特点需要大家在自己编写项目框架的过程中自己处理一下。


com.funtester.httpclient.FunLibrary#getHttpResponse方法使用如下:


    public static void main(String[] args) {
String url = "http://localhost:12345/m/info";//请求地址
HttpGet httpGet = getHttpGet(url); //获取请求响应 JSONObject response = getHttpResponse(httpGet); }
复制代码

JSON

这个地方我之前录了视频,主要讲了一些 JSON 基础操作。


资源释放

这个地方我已经在单个请求过程中的资源释放了。另外我还封装了一个方法用来全局回收资源的。当然如果只是单机版的 FunTester 测试框架的话,可以通过关闭 JVM 达到资源回收的目的。


    /**     * 结束测试,关闭连接池     */    public static void testOver() {        try {            ClientManage.httpsClient.close();            ClientManage.httpAsyncClient.close();        } catch (Exception e) {            logger.warn("连接池关闭失败!", e);        }    }
复制代码


下期分享接口实践,欢迎大家关注 FunTester 后续教程。

Have Fun ~ Tester !

发布于: 2 小时前阅读数: 3
用户头像

FunTester

关注

公众号:FunTester,650+原创,欢迎关注 2020.10.20 加入

Have Fun,Tester! 公众号FunTester,坚持原创文章的测试人。 FunTester测试框架作者,DCS_FunTester分布式性能测试框架作者。

评论

发布
暂无评论
HTTP接口测试基础【FunTester框架教程】