有2个http协议的api接口,一个是sendSmsCode,提供发送手机验证码的;一个是login,提供手机号验证码登陆的。
sendSmsCode这个api,内部逻辑是生成一个4位长度的随机码,以这个手机号为key,放入redis,然后触发短信服务。
login这个api呢,首先要根据入参的手机号和验证码,来验证是否匹配,匹配后判断数据状态,并且返回一个token。后续业务交互涉及到的api都会带着这个token来请求。
接下来,我写一个testcase来测试这2个接口。当然,很简单,用POSTMAN也很easy。模拟http请求即可。测通很容易。
可是呢,测试login时,因为本地环境不会真正下发短信,所以不知道那个验证码,这时,随便上送一个验证码,得到的响应报文都是验证码不正确之类的提示。因为只有验证码正确才能测后续流程。所以,写一段利用jedis获取验证码的代码即可。
package com.emaxcard.boss.modules.login.controller; import com.alibaba.fastjson.JSONObject; import com.emaxcard.boss.common.constant.CommonConstant; import com.emaxcard.boss.common.util.http.HttpUtil; import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.Map; public class UserLoginControllerTest { static String requestUrl = "http://localhost:8902/api/user/"; @Test public void loginReturnToken(){ //step1. 调用sendSmsCode接口 Map<String, String> params = new HashMap<>(); params.put("phone", "18310636588"); HttpUtil.post(JSONObject.toJSONString(params), requestUrl.concat("sendSmsCode")); //step2. 从redis获取验证码 Jedis jedis = new Jedis("192.168.1.107", 6379); jedis.auth("Redisadmin@2019"); //password jedis.select(8); //database String smsCode = jedis.get(CommonConstant.VALIDATE_H5_USER_PREFIX.concat("18310636588")); System.out.println("redis里的smsCode=" + smsCode); //step3. 登陆 params.put("smsCode", smsCode); params.put("source", "h5"); String response = HttpUtil.post(JSONObject.toJSONString(params), requestUrl.concat("login")); /*响应报文示例: {"success":true,"message":"操作成功!","code":200,"result":{"url":"/register.html","token":"eyJ0eXAiOiJNiJ9"},"timestamp":1582981585614} * */ JSONObject jsonResponse = JSONObject.parseObject(response); if (200 == jsonResponse.getIntValue("code")) { JSONObject result = JSONObject.parseObject(jsonResponse.getString("result")); String token = result.getString("token"); String url = result.getString("url"); System.out.println("token=" + token + " url=" + url); } } }