zoukankan      html  css  js  c++  java
  • 面试官问:实际生产中如何快速的测试接口(开发环境、测试环境、生产环境)

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

    案例如下:

    完美!

  • 相关阅读:
    Python文件相关的操作
    Python运算符
    字符串方法
    Python列表的增删改查和元祖
    压测
    jmeter相关使用
    charles的使用
    接口测试
    编程珠玑之关键字(1)--《c语言深度剖析》整理(转)
    循环单链表操作(转)
  • 原文地址:https://www.cnblogs.com/newAndHui/p/14226613.html
Copyright © 2011-2022 走看看