面试官问:实际生产中如何快速的测试接口(开发环境、测试环境、生产环境)

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、参数等)

案例如下:

完美!

posted @ 2021-01-03 19:35  李东平|一线码农  阅读(858)  评论(0编辑  收藏  举报