通用技术 [接口测试平台二期] 基于 okhttp 实现表单接口的自动化测试

bauul · 2018年05月04日 · 1144 次阅读

缘由

之前已经做过基于 http 协议,json 通信的接口自动化测试,眼光停留在本部门
现在想要将测试平台推广或运用到更多的业务或部门去,比如说:

  • 基于 ERP 系统的接口自动化 ==》比如一些活动(比如优惠活动,黑五活动)配置数据
  • 基于后端系统的接口自动化 ==》系统间调用(比如订单系统与物流系统)

那么这些接口如何做自动化呢?

这里主要讲表单接口的自动化,主要是踩坑

分类

基于上面的信息,带来下面的问题

  • 表单接口的自动化 =》不带文件上传的表单, 带文件上传的表单
  • Dubbo 接口的自动化 =》

依赖

我们使用 okhttp 来发请求

<properties>
    <okhttp3.version>3.10.0</okhttp3.version>
</properties>

    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>${okhttp3.version}</version>
    </dependency>

初始化

在初始化时,加入 cookie 存储和加载的代码


private static CookieJar cookieJar = new CookieJar() {
    //Cookie缓存区
    private final Map<String, List<Cookie>> cookiesMap = new HashMap<String, List<Cookie>>();
    @Override
    public void saveFromResponse(HttpUrl arg0, List<Cookie> arg1) {
        //移除相同的url的Cookie
        String host = arg0.host();
        System.out.println("save, host:" + host);
        List<Cookie> cookiesList = cookiesMap.get(host);
        cookiesMap.put(host, arg1);
    }

    @Override
    public List<Cookie> loadForRequest(HttpUrl arg0) {
        System.out.println("load, host:" + arg0.host());
        List<Cookie> cookiesList = cookiesMap.get(arg0.host());
        //注:这里不能返回null,否则会报NULLException的错误。
        //原因:当Request 连接到网络的时候,OkHttp会调用loadForRequest()
        return cookiesList != null ? cookiesList : new ArrayList<Cookie>();
    }
};

static {
    final int timeout = 30;
    client = new OkHttpClient().newBuilder()
            .connectTimeout(timeout, SECONDS)
            .readTimeout(timeout, SECONDS)
            .writeTimeout(timeout, SECONDS)
            .retryOnConnectionFailure(true)
            .cookieJar(cookieJar)
            .build();
}

表单接口的自动化测试

FormBody loginBody = new FormBody.Builder()
        .add("userName", "carl")
        .add("password", "123456")
        .build();

Request loginRequest = new Request.Builder()
        .url("http://aaaa.jolly.com/auth/login")
        .post(loginBody)
        .build();

Call loginCall = client.newCall(loginRequest);

try {
    //非异步执行
    Response loginResponse = loginCall.execute();

    //测试是否登陆成功
    System.out.println(loginResponse.body().string());
} catch (IOException e) {
    e.printStackTrace();
}

//获取需要提交的CookieStr
StringBuilder cookieStr = new StringBuilder();
//从缓存中获取Cookie
List<Cookie> cookies = client.cookieJar().loadForRequest(loginRequest.url());
//将Cookie数据弄成一行
for(Cookie cookie : cookies){
    cookieStr.append(cookie.name()).append("=").append(cookie.value()+";");
}
System.out.println("cookieStr:" + cookieStr.toString());

文件上传接口的自动化测试


RequestBody fileBody = RequestBody.create(MediaType.parse("multipart/form-data;charset=utf-8"), new File("E:\\apiTest\\ImportPurDemand.xls"));

RequestBody uploadBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("purDemandFile", "ImportPurDemand.xls", fileBody)
        .build();
Request uploadRequest = new Request.Builder()
        .url("http://xxxx.jolly.com/reviewPurchase/importPurDemand")
        .post(uploadBody)
        .build();

client.cookieJar().saveFromResponse(uploadRequest.url(), cookies);

Call uploadCall = client.newCall(uploadRequest);

try {
    //非异步执行
    Response uploadResponse = uploadCall.execute();

    System.out.println("pushRes body:" + uploadResponse.body().string());
} catch (IOException e) {
    e.printStackTrace();
}

结果

登录成功,上传文件成功,这里主要注意的是,登录的是 aaaa 系统,上传文件到 xxxx 系统,它们共用同一份 cookie

拓展

  • 表单接口的自动化到这里基本上算是没什么问题了,那么对于 xls 文件等这些测试文件,如何存储呢?
    建一个文件服务器吗?大家有什么好的主意,或者是如何做的?

  • 大家是如何做表单接口的自动化的?欢迎交流

计划

踩坑完成后,就可以将它做到服务端了

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册