JMeter多用户token使用

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JMeter多用户token使用相关的知识,希望对你有一定的参考价值。

在测试时,经常有模拟用户登录,获取用户token后再去请求接口的场景
性能中,需模拟多线程并发测试多用户产生多个token,每个用户使用各自的token进行接下来的请求

多用户获取多token并在接下来的业务接口请求中使用的场景非常多,接下来介绍的是其中一种通过将获取的token信息写入csv文件后再去读取的方式

一、场景接口

只有两个接口,一个是登录获取token的登陆接口,一个是使用token进行请求的业务接口

1.1 登录接口

请求:

POST http://localhost:5007/security/lluozh/login
Content-Type: application/json


	"username":"lluozh001",
	"password":"123456"

响应:

"code":200,"data":"lluozh001-token","msg":"ok"

1.2 业务接口

请求:

POST http://localhost:5007/security/lluozh/do?username=lluozh002
Content-Type: application/json
token: lluozh001-token

响应:

"code":200,"data":"lluozh001-token","msg":"ok"

服务接口简单的代码实现

@controller.route('/security/lluozh/login', methods=['POST'])
def lluozh_token():
    parser = RequestParser()
    parser.add_argument("username", location="json", required=True)
    parser.add_argument("password", location="json", required=False)

    req = parser.parse_args()
    token = req.get('username')+'-token'
    return make_response(jsonify(code=200, msg="ok", data=token), 200, '')


@controller.route('/security/lluozh/do', methods=['POST'])
def lluozh_do():
    return make_response(jsonify(code=200, msg="ok", data=request.headers.get('token')), 200, '')

二、登录接口处理

登录接口属于预请求,可以选择在setUp线程组中处理

2.1 csv账号文件

需要准备一个csv文件,里面用来存放需要登录的用户名和密码

2.2 csv数据文件获取

接下来在jmeter中配置csv文件,定义了两个变量username和pwd

2.3 登陆接口请求

然后配置登录的HTTP请求:

2.4 提取token信息

提取登陆成功后的token信息

2.5 access_token字段值被覆盖写入

由于有多个用户进行登录,但是这个提取操作每次都会把token赋值到access_token这个变量上面,是覆盖的操作
即每登录一个用户,这个access_token的值就会是最后一个登录的用户的token

那么需要把这些token存到一个地方,然后业务接口去这个地方取数据

2.6 获取的access_token写入csv文件

其实如果没有用户登录的操作,直接把token放到csv文件中,然后让jmeter循环使用准备好的token信息也是可以的
那么可以登陆后获取到token后,把token写到csv文件,这需要在登录接口后面加一个后置的处理

代码如下:

String p1 = System.getProperty("user.dir");
String p2 = System.getProperty("file.separator");
String p3 = "user_token.csv";
String path = p1 + p2 + p3;

FileWriter fileWriter = new FileWriter(new File(path), true);
BufferedWriter writer = new BufferedWriter(fileWriter);
writer.append(vars.get("username")+","+vars.get("access_token")+"\\n");
writer.close();
fileWriter.close();

可以实现把用户名和提取到的access_token写进csv文件中,这个文件所在的位置为jmeter的目录

修改setUp线程组的属性,把循环次数改成3。可以循环读取csv文件中的3个用户执行3登录

三、业务接口处理

业务接口要放到正常的线程组里面,独立于setUp线程组

3.1 csv数据文件获取

登录后会有一个csv文件,所以首先要做的csv文件读取的配置

上面的截图用的是$__P(user.dir,)$__P(file.separator,)user_token.csv这个文件路径,这个在本地环境的Jmeter是可以通过的
也可以忽略前面的路径,直接填写user_token.csv即可,得到的文件路径是一样的,一个是绝对路径一个是相对路径

3.2 业务接口请求

然后配置业务的HTTP请求

3.3 配置header信息

需要配置header信息,将token在header中配置

3.4 执行jmx脚本

试跑两次,可以发现业务请求接口的token请求头每次都在交替变化,这个是符合预期

3.5 追加重复写入csv文件

但是发现生成csv文件里面的数据重复,没有自动清理掉上一次产生的数据。如果产生的token 过期,那么等于使用过期的token

3.6 执行脚本后删除csv文件

需要增加tearDown线程组,每次跑完脚本把这个文件删除掉

代码:

String p1 = System.getProperty("user.dir");
String p2 = System.getProperty("file.separator");
String p3 = "user_token.csv";
String path = p1 + p2 + p3;

log.info("准备删除文件:" + path);

File file = new File(path);
if (!file.exists()) 
  log.info("删除文件失败:" + path + "不存在!");
 else 
  file.delete();

3.6 执行并发操作

重复并发执行写好的jmx文件

执行结果满足需求
即可以读取登陆后的token进行并发操作

以上是关于JMeter多用户token使用的主要内容,如果未能解决你的问题,请参考以下文章

JMeter多用户token使用

JMeter模拟多用户同时登录,token传递接口关联(同线程组)

JMeter_模拟微信多用户并发

Jmeter 将上一个请求的结果作为下一个请求的参数

jmeter关联的常用方法(关联token)

Jmeter获取token并使用