(四)java+okhttp+testng+poi做接口自动化测试

目前的项目结构

image.png

1.准备工作

在pom.xml中添加一下

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.11.0</version>
        </dependency>
        <!-- POI EXCEL 文件读写 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-excelant</artifactId>
            <version>3.14</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
        </dependency>

2.还是先来看用例

元素:接口url
动作:请求方式支持get、post
参数:是以json保存,现主要由两个节点param节点(请求参数)、headers(请求头参数)
期望:请求期望的反参


image.png

3.然后然后根据用例封装model数据(也是先读取excel文件中的数据,在依次封装model)

4.最最最最重要的okhttp请求工具类

get请求
    public String get(String url, String param) {
        JSONObject paramHeaderJO = JSONObject.parseObject(param);
        JSONObject paramJO = (JSONObject) paramHeaderJO.get("param");
        JSONObject headerJO = (JSONObject) paramHeaderJO.get("headers");
        String mergeUrl = MergeParam(url, paramJO);
        okhttp3.Request.Builder requestBuilder = new Request.Builder().url(mergeUrl);
        
        //遍历添加header
        if (null != headerJO) {
            for (String key : headerJO.keySet()) {
                requestBuilder.addHeader(key, headerJO.getString(key));
            }
        }

        Request request = requestBuilder.build();
        Call call = okHttpClient.newCall(request);
        Response response;
        // request.
        try {
            response = call.execute();
            // System.out.println(response.code());
            return response.body().string();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "异常:请求错误发生";
        }
    //拼装geturl
    public String MergeParam(String url, JSONObject param) {
        // JSONObject paramJO = JSONObject.parseObject(param);
        StringBuffer stringBuffer = new StringBuffer(url);
        stringBuffer.append("?");
        boolean isFrist = true;
        for (String key : param.keySet()) {
            if (!isFrist) {
                stringBuffer.append("&");
            } else {
                isFrist = false;
            }
            stringBuffer.append(key);
            stringBuffer.append("=");
            stringBuffer.append(param.get(key));
        }
        url = stringBuffer.toString();
        return url;
    }
post请求
public String post(String url, String param) {
        JSONObject paramHeaderJO = JSONObject.parseObject(param);
        JSONObject paramJO = (JSONObject) paramHeaderJO.get("param");
        JSONObject headerJO = (JSONObject) paramHeaderJO.get("headers");
        Builder formBuilder = new FormBody.Builder();
        //遍历添加请求参数
        if (null != paramJO) {
            for (String key : paramJO.keySet()) {
                formBuilder.add(key, paramJO.getString(key));
            }
        }

        FormBody formBody = formBuilder.build();
        // RequestBody body = RequestBody.create(type, param);
        // System.out.println(param);

        okhttp3.Request.Builder requestBuilder = new Request.Builder().url(url).post(formBody);
        //遍历添加header参数
        if (null != headerJO) {
            for (String key : headerJO.keySet()) {
                requestBuilder.addHeader(key, headerJO.getString(key));
            }
        }
        // Headers headers = new Headers(null);
        Request request = requestBuilder.build();

        Response response;
        Call call = okHttpClient.newCall(request);
        try {
            response = call.execute();
            response.headers();
            System.out.println(response.headers());
            return response.body().string();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.err.println();
            return "请求错误aaa";
        }

    }

5.然后是APITest(基本与之前的webtest差不多,只是修改了执行的方法)

package com.testng.testng;

import org.testng.annotations.Test;

import TestAutomationZ.apiCase.APICaseModel;
import TestAutomationZ.apiCase.APIStepModel;
import TestAutomationZ.okHttp.OkHttpUtil;

import static org.testng.Assert.assertEquals;

import java.util.List;

import org.testng.annotations.DataProvider;

public class APITest {
    List<APICaseModel> caseList;
    OkHttpUtil okHttpUtil;

    public APITest(List<APICaseModel> caseLiset) {
        // TODO Auto-generated constructor stub
        okHttpUtil = new OkHttpUtil();
        this.caseList = caseLiset;
    }
    @Test(dataProvider = "dp")
    public void f(APICaseModel caseModel) {
        doCase(caseModel);
    }

    // 根据case模型执行用例
    public void doCase(APICaseModel caseModel) {
        for (int i = 0; i < caseModel.getStepModels().size(); i++) {
            APIStepModel apiStepModel = caseModel.getStepModels().get(i);
            if (apiStepModel.getAction().equals("get")) {
                //执行get请求
                String actual = okHttpUtil.get(apiStepModel.getUrl(), apiStepModel.getValue());
                assertEquals(actual, apiStepModel.getExpect());
            } else if (apiStepModel.getAction().equals("post")) {
                //执行post请求
                String actual = okHttpUtil.post(apiStepModel.getUrl(), apiStepModel.getValue());
                assertEquals(actual, apiStepModel.getExpect());
            } else {
                System.err.println("haimeixie");
            }

        }
    }

    @DataProvider
    public Object[] dp() {
//      caseList = APICaseModel.getCaseList("caseexcel/apicase/APIExample.xlsx");
        // 获取用例
        int size = caseList.size();
        Object[] objects = new Object[size];
        for (int i = 0; i < objects.length; i++) {
            objects[i] = caseList.get(i);
        }
        return objects;
    }
}

6.在Test工厂类中添加相应的构建APItest的动作

package com.testng.testng;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

//import org.testng.TestNG;
import org.testng.annotations.Factory;

import TestAutomationZ.Case.CaseModel;
import TestAutomationZ.apiCase.APICaseModel;

public class TestFactory {
    @Factory
    public Object[] createInstances() {
        List<String> webPathList = getWebCasePathList();
        List<String> APIPathList = getAPICasePathList();
        int resultSize = webPathList.size() + APIPathList.size();
        Object[] result = new Object[resultSize];
        //生成webTest
        for (int i = 0; i < webPathList.size(); i++) {
            // CaseModel.getCaseList(pathList.get(i), CaseType.publicCase);
            result[i] = new WebTest(CaseModel.getCaseList(webPathList.get(i)));
        }
        //生成APITest
        for (int i = 0, j = webPathList.size(); j < result.length; i++, j++) {
            result[j] = new APITest(APICaseModel.getCaseList(APIPathList.get(i)));
        }
        return result;
    }

    // 获取web测试用例
    static public ArrayList<String> getWebCasePathList() {
        ArrayList<String> files = new ArrayList<String>();
        File file = new File("caseexcel/webcase/");
        File[] tempList = file.listFiles();
        if (tempList.length > 0) {
            for (int i = 0; i < tempList.length; i++) {
                if (tempList[i].isFile()) {
                    System.out.println("文     件:" + tempList[i]);
                    files.add(tempList[i].toString());
                }
                if (tempList[i].isDirectory()) {
                    // System.out.println("文件夹:" + tempList[i]);
                }
            }
        } else {
            throw new NullPointerException("没有找到case");
        }

        return files;
    }

    // 获取接口测试用例
    static public ArrayList<String> getAPICasePathList() {
        ArrayList<String> files = new ArrayList<String>();
        File file = new File("caseexcel/apicase/");
        File[] tempList = file.listFiles();
        if (tempList.length > 0) {
            for (int i = 0; i < tempList.length; i++) {
                if (tempList[i].isFile()) {
                    System.out.println("文     件:" + tempList[i]);
                    files.add(tempList[i].toString());
                }
                if (tempList[i].isDirectory()) {
                    // System.out.println("文件夹:" + tempList[i]);
                }
            }
        } else {
            throw new NullPointerException("没有找到case");
        }

        return files;
    }
}

最后github地址:https://github.com/ahaMrz/test

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 接口测试自动化的优点: 1,web自动化说起来很多人都会直接想到UI自动化这个设计,很少有人直接第一个概念是接口自...
    路边看雪的小男孩阅读 10,334评论 1 26
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,108评论 2 89
  • 苏霍姆林斯基指出:“所有那些有教养、品行端正、值得信赖的年轻人,他们大多出自对书籍有着热忱的爱心的家庭。”...
    聆音_6dc5阅读 1,443评论 0 0
  • 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 引用 代码粗体斜体博客完整教程
    Z_ying521阅读 1,404评论 0 0
  • 交流热线 18260126863 有很多朋友曾经找我,让我帮忙找和田玉。大多数人,我回复的很简单,就是劝他们先不要...
    9a2afe2f3557阅读 1,456评论 0 0