面試官問:實際生產中如何快速的測試接口(開發環境、測試環境、生產環境)


1.背景

在實際開發中測試代碼時必不可少的環節,

並且通常要測試開發環境、測試環境、預發布環境、灰度測試、生產環境等

2.測試代碼設計

步驟一:編寫一個測試基類Base,這個基類里面主要是定義接口使用的token值、簽名值的生成方法、不同環境的接口ip、測試模板等

package com.ldp.user.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;

import java.util.Map;
import java.util.TreeMap;

/**
 * @Copyright (C) 四川XXXX科技有限公司
 * @Author: LI DONG PING
 * @Date: 2020-05-01 10:03
 * @Description: <p>
 * http://localhost:8080/api/swagger-ui.html
 * </p>
 */
public class Base {
    public static String token = "eyJhbsInN1YiI6IntcImhhc1Bob25lTm9cIjp0cnVlLFwibG9naW5UeXBlXCI6MSxcInVzZXJJZFwiOjIyMX0iLCJleHAiOjE1ODc1OTI4NzJ9.2ZL06sIiTzG331K2EBy5UPWiB06PgZ8eSZAmzGlp9C-Dm39k0iI-dVNvrQBCLRhBhjevp01q3rBHWEVz3dMtWw";
    /**
     * 用於切換測試的環境
     */
    public static String urlLocal = "http://localhost:8080/api";
    public static String urlIp = "";
    public static String urlDev = "";
    public static String urlTest = "";
    public static String urlPro = "";

    /**
     * 測試模板
     */
    public void test() {
        String url = urlLocal + "/";
        System.out.println("請求地址:" + url);
        HttpRequest request = HttpUtil.createRequest(Method.GET, url);
        // 注意這里使用TreeMap
        Map<String, Object> map = new TreeMap<>();
        // 業務參數
        map.put("name", "11");

        // 公用參數
        map.put("appid", "1001");
        map.put("sequenceId", "seq" + System.currentTimeMillis());
        map.put("timeStamp", System.currentTimeMillis());
        map.put("sign", signApi(map, "123456"));
        request.form(map);
        System.out.println("請求參數:" + map);
        request.header("Authorization", token);
        request.setConnectionTimeout(60 * 1000);
        String response = request.execute().body();
        System.out.println("請求結果:" + response);
    }

    /**
     * api接口簽名規則
     *
     * @param map
     * @return
     */
    public String signApi(Map<String, Object> map, String md5Key) {
        StringBuilder sb = new StringBuilder();
        for (String key : map.keySet()) {
            Object o = map.get(key);
            if (o == null || StrUtil.isEmpty(o.toString())) {
                continue;
            }
            sb.append(key + "=").append(map.get(key) + "&");
        }
        String str1 = sb.toString();
        String str = str1.substring(0, str1.length() - 1) + md5Key;
        String md5 = SecureUtil.md5(str);
        System.out.println("簽名參數:" + map);
        System.out.println("簽名key:" + md5Key);
        System.out.println("簽名原串:" + str);
        System.out.println("簽名簽名值:" + md5);
        return md5;
    }

}
View Code

 

步驟二:編寫或快速生成測試類

如何自動生成測試代碼:https://www.cnblogs.com/newAndHui/p/11205750.html

package com.ldp.user.controller;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;

import java.util.Map;
import java.util.TreeMap;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 01/01 11:49
 * @description
 */
class UserOrderControllerTest extends Base {
    /**
     * 統一日志輸出測試
     */
    @Test
    void logTest() {
        for (int i = 100; i < 101; i++) {
            String url = urlLocal + "/userOrder/log";
            System.out.println("請求地址:" + url);
            HttpRequest request = HttpUtil.createRequest(Method.GET, url);
            Map<String, Object> map = new TreeMap<>();
            // 業務參數
            map.put("message", "abc");

            // 公用參數
            map.put("appid", "1001");
            map.put("sequenceId", "seq" + System.currentTimeMillis());
            map.put("timeStamp", System.currentTimeMillis());
            map.put("sign", signApi(map, "123456"));
            request.form(map);
            System.out.println("請求參數:" + map);
            request.header("Authorization", token);
            request.setConnectionTimeout(60 * 1000);
            String response = request.execute().body();
            System.out.println("請求結果:" + response);
        }
    }

    @Test
    void md5Test() {
        String url = urlLocal + "/userOrder/md5Test";
        System.out.println("請求地址:" + url);
        HttpRequest request = HttpUtil.createRequest(Method.GET, url);
        Map<String, Object> map = new TreeMap<>();
        // 業務參數
        map.put("name", "趙敏");
        map.put("age", "18");
        map.put("address", "光明頂");

        // 公用參數
        map.put("appid", "1001");
        map.put("sequenceId", "seq" + System.currentTimeMillis());
        map.put("timeStamp", System.currentTimeMillis());
        map.put("sign", signApi(map, ""));
        request.form(map);
        System.out.println("請求參數:" + map);
        request.header("Authorization", token);
        request.setConnectionTimeout(60 * 1000);
        String response = request.execute().body();
        System.out.println("請求結果:" + response);
    }

    @Test
    void paramCheck() {
        String url = urlLocal + "/userOrder/paramCheck";
        System.out.println("請求地址:" + url);
        HttpRequest request = HttpUtil.createRequest(Method.GET, url);
        Map<String, Object> map = new TreeMap<>();
        // 業務參數
        map.put("weChat", "851298348");
        map.put("name", "李東平");
        map.put("age", "18");
        //  map.put("status", "0");
        map.put("address", "四川成都");

        // 公用參數
        map.put("appid", "1001");
        map.put("sequenceId", "seq" + System.currentTimeMillis());
        map.put("timeStamp", System.currentTimeMillis());
        map.put("sign", signApi(map, "123456"));
        String param = JSON.toJSONString(map);
        request.body(param);
        System.out.println("請求參數:" + param);
        request.header("Authorization", token);
        request.setConnectionTimeout(60 * 1000);
        String response = request.execute().body();
        System.out.println("請求結果:" + response);
    }

    /**
     * 異常處理測試
     */
    @Test
    void exceptionTest() {
        String url = urlLocal + "/userOrder/exception";
        System.out.println("請求地址:" + url);
        HttpRequest request = HttpUtil.createRequest(Method.GET, url);
        Map<String, Object> map = new TreeMap<>();
        // 業務參數 0,1,2,3
        map.put("num", "2");
        // 公用參數
        map.put("appid", "1001");
        map.put("sequenceId", "seq" + System.currentTimeMillis());
        map.put("timeStamp", System.currentTimeMillis());
        map.put("sign", signApi(map, "123456"));
        request.form(map);
        System.out.println("請求參數:" + map);
        request.header("Authorization", token);
        request.setConnectionTimeout(60 * 1000);
        String response = request.execute().body();
        System.out.println("請求結果:" + response);
    }
}
View Code

3.使用postmain測試

個人不建議使用這個測試,雖然我看見很多人都在使用它做測試!

原因在於

1.測試參數不便於保存和共享給他人測試;

2.測試簽名參數需要在其他地方生成好后復制進去;

3.每個人測試的時候都需要去填寫一次參數;

但是有時候如果自己寫代碼測試不通,可以使用postmain測試驗證一下到底是自己的測試代碼有問題還是接口本身有問題;

使用方式:

步驟一:下載並安裝postmain

步驟二:填寫測試數據(url、參數等)

案例如下:

完美!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM