Jmeter测试登录接口遇到的问题总结的

使用场景

在jmeter上,进行登录接口测试:通过手机号码和短信验证码实现登录

实现思路

工具及版本

1、Mysql 5.7
2、Jmeter 4.0
3、服务器Linux

Jmeter用到的组件

1、JDBC连接池和请求
2、循环控制器
3、计数器
4、if控制器
……

实现思路

Jmeter测试登录接口遇到的问题总结的_第1张图片
如上图:
步骤一、通过访问数据库对应表获取手机号码和短信验证码
1、使用JDBC请求获取满足条件的登录手机号;
2、从1的结果中提取手机号,获取对应的验证码;

在这个过程中,需要做以下考虑:
1)数据库中查到的手机号不止一个,因此需要循环逐个获取,所以循环逐个获取手机号,循环次数不大于手机号个数;
2)需要考虑验证码的过期时间,所以引入if控制器,判断验证码是否过期:如果过期,则重新获取,如果不过期,则使用当前的;
3)发送验证码时,需要考虑验证码的发送时间,故在查询验证码前要有一个等待时间,因此引入查询等待;
步骤二、将获取的数据作为参数传递到https登录接口

过程中遇到的问题

问题1:JDBC连接池的设置中,Mysql URL 的书写和 Driver 的放置路径问题?

URL=“jdbc:mysql://localhost:{端口}/{数据库名}”

驱动包的放置路径:放到%JMETER_HOME%\lib 目录下,笔者使用的驱动包是 8.0.15。

问题2:JDBC Request 的设置中,Variable Name Bound of Pool 漏填问题

在使用JDBC Request时,头部的 Variable Name Bound of Pool 必须填写,而且要跟在JDBC连接池设置的 Variable Name Bound of Pool 完全相同。

问题3:使用 JDBC Request 获取的数据定义成变量,在引用时必须使用 “${…_1}” 的形式

Jmeter测试登录接口遇到的问题总结的_第2张图片
“_1” 表示取请求结果的第一个数据,是必须加的。
如果不加会导致引用失败:通过 JDBC请求获取到的数据,会被认为是类似于数组的一个数据列表,从1开始计数。如果不加后缀,jmeter会因为不知道要取那个数据而报错。

问题4:在通过手机号查询对应验证码时,因为要从手机号列表中逐个取手机号,碰到了两个变量组合的问题。

两个变量组合成一个新的变量,需要用到jmeter的 “_V()” 函数,举例说明:
Jmeter测试登录接口遇到的问题总结的_第3张图片
以上手机号列表,在循环逐个获取时,它的下标后缀需要跟着改变,故引入 “id” 这个变量来表示这个后缀,那么获取某个具体手机号的变量表达式就是:
在这里插入图片描述

补充:关于 “_V()” 函数的使用

在Jmeter面板,打开 “选项–>函数助手对话框”,然后进行如下图操作,其中步骤 ④ 是在变量在jmeter中的两种表示形式:变量引用和代码。
Jmeter测试登录接口遇到的问题总结的_第4张图片

问题5:if控制器在使用时,即使条件满足也未生效的问题

在这里插入图片描述
设置的 if 条件一直未生效的原因是,勾选了条件框下的 Interpret Condition as Variable Expression?,这个意思是“判断变量值是否等于字符串,不区分大小写”。由于我的变量都是int类型了,所以勾选这个后,判断结果一直是False,因此一直没有执行。取消勾选后,条件判断实现。

问题6:系统当前时间戳的获取问题

方法一:使用函数助手的 “_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

你可能感兴趣的:(测试)