在jmeter上,进行登录接口测试:通过手机号码和短信验证码实现登录
1、Mysql 5.7
2、Jmeter 4.0
3、服务器Linux
1、JDBC连接池和请求
2、循环控制器
3、计数器
4、if控制器
……
如上图:
步骤一、通过访问数据库对应表获取手机号码和短信验证码
1、使用JDBC请求获取满足条件的登录手机号;
2、从1的结果中提取手机号,获取对应的验证码;
在这个过程中,需要做以下考虑:
1)数据库中查到的手机号不止一个,因此需要循环逐个获取,所以循环逐个获取手机号,循环次数不大于手机号个数;
2)需要考虑验证码的过期时间,所以引入if控制器,判断验证码是否过期:如果过期,则重新获取,如果不过期,则使用当前的;
3)发送验证码时,需要考虑验证码的发送时间,故在查询验证码前要有一个等待时间,因此引入查询等待;
步骤二、将获取的数据作为参数传递到https登录接口
URL=“jdbc:mysql://localhost:{端口}/{数据库名}”
驱动包的放置路径:放到%JMETER_HOME%\lib 目录下,笔者使用的驱动包是 8.0.15。
在使用JDBC Request时,头部的 Variable Name Bound of Pool 必须填写,而且要跟在JDBC连接池设置的 Variable Name Bound of Pool 完全相同。
“_1” 表示取请求结果的第一个数据,是必须加的。
如果不加会导致引用失败:通过 JDBC请求获取到的数据,会被认为是类似于数组的一个数据列表,从1开始计数。如果不加后缀,jmeter会因为不知道要取那个数据而报错。
两个变量组合成一个新的变量,需要用到jmeter的 “_V()” 函数,举例说明:
以上手机号列表,在循环逐个获取时,它的下标后缀需要跟着改变,故引入 “id” 这个变量来表示这个后缀,那么获取某个具体手机号的变量表达式就是:
在Jmeter面板,打开 “选项–>函数助手对话框”,然后进行如下图操作,其中步骤 ④ 是在变量在jmeter中的两种表示形式:变量引用和代码。
设置的 if 条件一直未生效的原因是,勾选了条件框下的 Interpret Condition as Variable Expression?,这个意思是“判断变量值是否等于字符串,不区分大小写”。由于我的变量都是int类型了,所以勾选这个后,判断结果一直是False,因此一直没有执行。取消勾选后,条件判断实现。
方法一:使用函数助手的 “_time()” 函数进行转换
转换公式如下:
第一种: ${__time(,now)} : 默认该公式精确到毫秒级别,13位数,其中now是生成的变量名,可省略
第二种: ${__time(/1000,)} : 该公式精确到秒级别, 10位数
第三种: ${__time(yyyy-MM-dd,)} :该公式返回的形式是 2019-04-09
第四种: ${__time(YMDHMS,)} :该公式返回形式是 20190409-182603
补充:_time 函数返回当前时间,可以指定返回格式,由 SimpleDateFormat 类来处理函数格式。
年:yyy
月:MM
日:dd
时:hh
分:mm
秒:ss
方法二:利用BeanShell Sampler,写java代码来获取
在Java中写一个获取当前时间戳的类,导出为可以执行的jar,放到 jmeter 的l \lib\ext 下,然后在 BeanShell Sampler 中调用。可参考链接:https://testerhome.com/topics/9617