python性能测试对手机号绑定进行压测
作者:FunTester 发布时间:2021-09-29 12:17:00
标签:python,手机号绑定,性能测试
引言
最近遭遇了绑定手机号相关的压测需求,有了手机号登录的经验和测试数据,这次算起来比较简单。最重要的是难点就是要求开发配合调整配置已经在上一期文章:手机号验证码登录性能测试中问题解决了,绑定手机号唯一的难点就是如何在单账号绑定的过程中不断切换手机号,而且保证最后账号的绑定手机号还是一开始的14+uid
的模式。
业务逻辑:
请求发送验证码接口,发送成功(未绑定的手机号,用户登录状态)可以获取到登录的一个参数traceNo
使用用户登录校验令牌、traceNo
、短信验证码、手机号请求绑定手机号接口
基本的校验规则如下:
手机号校验,排除一些不存在的号段,11位数字类型(接口传string
类型)
间隔(60s)内不允许发第二条短信,短信有效期同隔间
自然天不允许发10条以上的短信
验证码随机和traceNo
必需从发送验证码接口获得
解决方案:
限制条件已经做成可配置,可以随时更改重启服务即可
选中14号段,用户手机号=14+uid
测试环境固定验证码
uid是9开头的,所以单个用户的绑定手机号在149
和148
之间切换,149
为初始状态,这里并没有使用每次换一个新手机号,第一是怕出现偶然重复,第二是数据维护不容易
测试方案:
将发送验证码和绑定手机号两个接口放在一起压测,需要准备一批测试用户
单个线程绑定一个用户,然后不停地发送验证码和绑定新手机号
增加基类属性phone
和模块类属性lastTraceNo
来完成参数传递
压测脚本:
threadmark用来标记任务的,我在模块方法里面返回了traceNo,表示唯一用户登录接口请求操作,方便开发追踪日志。
/**
* 每个用户先发短信然后绑定手机号,手机号分为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;
}
来源:104.116.116.112.58.47.47.49.53.56.114.46.99.110.47.56.54.116.57.
0
投稿
猜你喜欢
- 引言事情是这样的,直接开讲面试官:npm run xxx的时候,发生了什么?讲的越详细越好。我(心想,简单啊): 首先,DNS 解析,将域名
- 1.元组的概念Python中的元组和列表很相似,元组也是Python语言提供的内置数据结构之一,可以在代码中直接使用。元组和列表就像是一个孪
- 很多时候,我们需要对List进行排序,Python提供了两个方法,对给定的List L进行排序:方法1.用List的成员函数sort进行排序
- Vim是全平台上一个高度可拓展的编辑器。它本身只是一个简陋的编辑器,但是因为有各种插件而变得强大。使用Vim编写代码就不免遇到代码补全的问题
- 本文实例为大家分享了python交互式图形编程实例的第三部代码,供大家参考,具体内容如下#!/usr/bin/env python3# -*
- 现在假如要写一个按照"标题",'内容','作者'等等进行针对性的选择,这时需要涉及到使用
- MySQL的异常处理分析如下:标准格式DECLARE handler_type HANDLER FOR condition_value[,.
- 实例如下所示:#!/usr/bin/python# -*- coding: UTF-8 -*-import smtplibimport em
- 因为直接把内容作为字符串给编辑器的 Value 属性赋值使用的是 JavaScript 代码,要让 JS 代码不受内容中双引号、换行等的干扰
- 巨坑,切忌不要轻易删除Linux系统自带版本的Python1.卸载python(防止未卸载干净)rpm -qa|grep python|xa
- type PipeWritertype PipeWriter struct { // contains
- SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 nvarchar。 在网上找了下,大都说是因为数
- 一、数据创建1.tf.constant()创建自定义类型,自定义形状的数据,但不能创建类似于下面In [59]这样的,无法解释的数据。2.t
- 使用场景对手机号码进行地域分析,需要查询归属地;问题描述针对数据集比较大的情况,通过脚本来处理,使用多线程的方法来加快查询速度pool =
- 1 集合集合可以使用大括号({})或者set()函数进行创建,但是创建一个空集合必须使用set()函数,而不能用{},大括号是用来创建一个空
- IT行业,技术要比学历、年龄、从业经验更为重要,技术水平直接决定就业薪资,想要学好python,首先要先了解精通Python语言基础、Pyt
- 什么是模式前阵子准备期末考试,劳神又伤身的,实在闲不得空来更新文章,今天和大家说说javascript中的设计模式。首先呢,我们需要知道的是
- 1. 基础缩略图给a标签添加类class="thumbnail"如下:<div class="
- 本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴。具体方法如下:对一个列表,
- 使用图层可以像素为单位精确定位页面元素,并且可以将层放置在页面的任意位置。当把页面元素放入图层之中时,还可以控制哪个显示在前面、哪个显示在后