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; } }
步骤二:编写或快速生成测试类
如何自动生成测试代码: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); } }
3.使用postmain测试
个人不建议使用这个测试,虽然我看见很多人都在使用它做测试!
原因在于
1.测试参数不便于保存和共享给他人测试;
2.测试签名参数需要在其他地方生成好后复制进去;
3.每个人测试的时候都需要去填写一次参数;
但是有时候如果自己写代码测试不通,可以使用postmain测试验证一下到底是自己的测试代码有问题还是接口本身有问题;
使用方式:
步骤一:下载并安装postmain
步骤二:填写测试数据(url、参数等)
案例如下: