「原创声明:保留所有权利,禁止转载」
最近遭遇了绑定手机号相关的压测需求,有了手机号登录的经验和测试数据,这次算起来比较简单。最重要的是难点就是要求开发配合调整配置已经在上一期文章:手机号验证码登录性能测试中问题解决了,绑定手机号唯一的难点就是如何在单账号绑定的过程中不断切换手机号,而且保证最后账号的绑定手机号还是一开始的14+uid
的模式。
业务逻辑:
- 请求发送验证码接口,发送成功(未绑定的手机号,用户登录状态)可以获取到登录的一个参数
traceNo
- 使用用户登录校验令牌、
traceNo
、短信验证码、手机号请求绑定手机号接口
基本的校验规则如下:
- 手机号校验,排除一些不存在的号段,11 位数字类型(接口传
string
类型) - 间隔(60s)内不允许发第二条短信,短信有效期同隔间
- 自然天不允许发 10 条以上的短信
- 验证码随机和
traceNo
必需从发送验证码接口获得
解决方案:
- 限制条件已经做成可配置,可以随时更改重启服务即可
- 选中 14 号段,用户手机号=14+uid
- 测试环境固定验证码
- uid 是 9 开头的,所以单个用户的绑定手机号在
149
和148
之间切换,149
为初始状态,这里并没有使用每次换一个新手机号,第一是怕出现偶然重复,第二是数据维护不容易
测试方案:
- 将发送验证码和绑定手机号两个接口放在一起压测,需要准备一批测试用户
- 单个线程绑定一个用户,然后不停地发送验证码和绑定新手机号
- 增加基类属性
phone
和模块类属性lastTraceNo
来完成参数传递
压测脚本:
- threadmark 用来标记任务的,我在模块方法里面返回了 token,表示唯一用户登录接口请求操作,方便开发追踪日志。
/**
* 每个用户先发短信然后绑定手机号,手机号分为148和149切换,后8位于uid后8位.最后会把测试数据固定在149号段
*/
class BindPhone extends OkayBase {
public static void main(String[] args) {
def argsUtil = new ArgsUtil(args)
def thread = argsUtil.getIntOrdefault(0, 100)
def times = argsUtil.getIntOrdefault(1, 50)
ClientManage.init(10000, 5000, 0)
def threads = []
thread.times {
def base = getBase(it)
def info = new UserInfo(base)
threads << new Bind(info, times)
}
new Concurrent(threads, "学生留存1.2.3绑定手机号").start()
thread.times {
def base = getBase(it)
def info = new UserInfo(base)
info.bindPhoneInit()
}
FanLibrary.testOver()
}
static class Bind extends ThreadLimitTimesCount<UserInfo> {
public LoginTel(UserInfo info, int times) {
super(info, times, null)
}
@Override
protected void doing() throws Exception {
threadmark = t.bindPhone()
}
}
}
模块类方法:
/**
* 获取用户信息
*
* @return
*/
public JSONObject getUserInfo() {
String url = UserInfoApi.USERINFO;
JSONObject params = getParams();
JSONObject response = getPostResponse(url, params);
output(response);
return response;
}
/**
* 绑定手机号
*
* @return
*/
public JSONObject bindPhone(String phone) {
sendCodeOnline(phone);
String url = UserInfoApi.BIND_PHONE;
JSONObject params = getParams();
params.put("phone", phone);
params.put("traceno", lastTraceNo);
params.put("code", Common.TEL_CODE);
JSONObject response = getPostResponse(url, params);
output(response);
return response;
}
/**
* 绑定手机号,压测用
*
* @return
*/
public String bindPhone() {
phone = phone.startsWith("149") ? 148 + phone.substring(3) : 149 + phone.substring(3);
bindPhone(phone);
return lastTraceNo;
}
/**
* 初始化手机号,默认id前两位改成14
*
* @return
*/
public JSONObject bindPhoneInit() {
JSONObject userInfo = getUserInfo();
String tel = userInfo.getJSONObject("data").getString("tel");
if (tel.startsWith("149")) return null;
phone = 149 + phone.substring(3);
sendCodeOnline(phone);
String url = UserInfoApi.BIND_PHONE;
JSONObject params = getParams();
params.put("phone", phone);
params.put("traceno", lastTraceNo);
params.put("code", Common.TEL_CODE);
JSONObject response = getPostResponse(url, params);
output(response);
return response;
}
/**
* 发送绑定手机号信息
*
* @param phone
* @return
*/
public JSONObject sendCodeOnline(String phone) {
String url = UserInfoApi.SEND_CODE_ONLINE;
JSONObject params = getParams();
params.put("scene_type", 1);//1绑定手机
params.put("phone", phone);
output(phone);
JSONObject response = getPostResponse(url, params);
output(response);
if (isRight(response)) {
lastTraceNo = response.getJSONObject("data").getString("traceno");
}
return response;
}
- 郑重声明:“FunTester” 首发,欢迎关注交流,禁止第三方转载。
技术类文章精选
- Linux 性能监控软件 netdata 中文汉化版
- 图解 HTTP 脑图
- 性能测试中图形化输出测试数据
- JMeter 吞吐量误差分析
- 多项目登录互踢测试用例
- 从 Java 到 Groovy 的八级进化论
- JMeter 如何模拟不同的网络速度
- 6 个重要的 JVM 性能参数
无代码文章精选
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。