(四)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
參數(shù):是以json保存,現(xiàn)主要由兩個節(jié)點param節(jié)點(請求參數(shù))托酸、headers(請求頭參數(shù))
期望:請求期望的反參


image.png

3.然后然后根據(jù)用例封裝model數(shù)據(jù)(也是先讀取excel文件中的數(shù)據(jù),在依次封裝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 "異常:請求錯誤發(fā)生";
        }
    //拼裝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();
        //遍歷添加請求參數(shù)
        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參數(shù)
        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差不多柒巫,只是修改了執(zhí)行的方法)

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);
    }

    // 根據(jù)case模型執(zhí)行用例
    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")) {
                //執(zhí)行get請求
                String actual = okHttpUtil.get(apiStepModel.getUrl(), apiStepModel.getValue());
                assertEquals(actual, apiStepModel.getExpect());
            } else if (apiStepModel.getAction().equals("post")) {
                //執(zhí)行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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末获高,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吻育,更是在濱河造成了極大的恐慌念秧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件布疼,死亡現(xiàn)場離奇詭異摊趾,居然都是意外死亡,警方通過查閱死者的電腦和手機游两,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門砾层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贱案,你說我怎么就攤上這事肛炮。” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵侨糟,是天一觀的道長碍扔。 經(jīng)常有香客問我,道長秕重,這世上最難降的妖魔是什么不同? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮溶耘,結果婚禮上二拐,老公的妹妹穿的比我還像新娘。我一直安慰自己凳兵,他們只是感情好百新,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庐扫,像睡著了一般饭望。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聚蝶,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音藻治,去河邊找鬼碘勉。 笑死,一個胖子當著我的面吹牛桩卵,可吹牛的內(nèi)容都是我干的验靡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雏节,長吁一口氣:“原來是場噩夢啊……” “哼胜嗓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钩乍,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辞州,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寥粹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體变过,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年涝涤,在試婚紗的時候發(fā)現(xiàn)自己被綠了媚狰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡阔拳,死狀恐怖崭孤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤辨宠,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布遗锣,位于F島的核電站,受9級特大地震影響彭羹,放射性物質(zhì)發(fā)生泄漏黄伊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一派殷、第九天 我趴在偏房一處隱蔽的房頂上張望还最。 院中可真熱鬧,春花似錦毡惜、人聲如沸拓轻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扶叉。三九已至,卻和暖如春帕膜,著一層夾襖步出監(jiān)牢的瞬間枣氧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工垮刹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留达吞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓荒典,卻偏偏與公主長得像酪劫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寺董,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 接口測試自動化的優(yōu)點: 1覆糟,web自動化說起來很多人都會直接想到UI自動化這個設計,很少有人直接第一個概念是接口自...
    路邊看雪的小男孩閱讀 4,917評論 1 26
  • 關于Mongodb的全面總結 MongoDB的內(nèi)部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評論 2 89
  • 蘇霍姆林斯基指出:“所有那些有教養(yǎng)、品行端正御吞、值得信賴的年輕人踢械,他們大多出自對書籍有著熱忱的愛心的家庭∑桥海”...
    聆音_6dc5閱讀 201評論 0 0
  • 一級標題 二級標題 三級標題 四級標題 五級標題 六級標題 引用 代碼粗體斜體博客完整教程
    Z_ying521閱讀 201評論 0 0
  • 交流熱線 18260126863 有很多朋友曾經(jīng)找我内列,讓我?guī)兔φ液吞镉瘛4蠖鄶?shù)人背率,我回復的很簡單话瞧,就是勸他們先不要...
    9a2afe2f3557閱讀 211評論 0 0