zoukankan      html  css  js  c++  java
  • Jmeter——如何使得token在各线程组间引用的游刃有余

    在以前的博文中,有介绍过,jmeter基本的关联,关联就是将参数在各接口中动态传参,使得接口脚本变得灵活使用,非一次性脚本。今天再来介绍一种jmeter全局变量的设置与使用,可以让脚本运用更丰富,场景覆盖更广。

    应用场景

    在做性能测试或多业务场景测试时,将多个业务写在多个线程组中,但都是一个正常的流程。全程只需登录一次,这时就需要设置全局变量来实现。我们也知道,只将token提取并设置为一个普通变量的话,是不能实现跨线程组调用的。跨线程组调用,只能引用全局变量。

    使用场景

    前置处理器BeanShell PreProcessor

    使用前置处理器BeanShell PreProcessor,编写如下代码:

    通过vars.put()方法,将a1的值写入到token中

    在信息头中,引用该参数如下,使用的是__P()函数,__P()是一个简化的属性函数,用于与命令行上定义的属性一起使用。

    运行脚本,查看数据,在运行日志中查看token

    在请求头中查看token数据

    后置处理器BeanShell PostProcessor

    使用后置处理器BeanShell PostProcessor,编写代码如下:

    在线程组2中的信息头里引用如下

    执行脚本,查看数据

    __setProperty(,,)函数

    在后置处理器中,使用__setProperty(,,)函数,函数介绍如下:

    该函数用于设置 JMeter 属性的值。

    函数的默认返回值是空字符串,因此该函数可以被用在任何地方,只要对函数本身调用是正确的。

    通过将函数可选的第3个参数设置为"true",函数就会返回属性的原始值。

    属性对于JMeter是全局的,因此可以被用来在线程和线程组之间通信。

    在后置处理器中,编写代码如下:

    在线程组2中的信息头中引用如下:

    __property函数是用于获取属性值

    示例:

    ${__property(department.id)} 返回 department.id 的值。
    ${__property(department.id,UUID)} 返回 department.id 的值,并保存在变量 UUID 中。

    ${__property(abcd,ABCD,atod)} 返回属性 abcd 的值,如果该属性未定义则返回 atod,并保存在变量 ABCD 中。
    ${__property(abcd,,atod)} 返回属性 abcd 的值,如果该属性未定义则返回 atod,不保存结果值。

    运行脚本,查看结果

    参数化跨线程传参

    使用后置处理器BeanShell PostProcessor,将登录获取到的token,写入到文件中,并引用csv元件进行参数化。这种方式稍微麻烦点,但还是能够满足跨线程调用参数的,后置处理器中的参考代码如下:

     1 import java.io.BufferedReader;
     2 import java.io.File;
     3 import java.io.FileReader;
     4 import java.io.IOException;
     5 import java.io.FileWriter;
     6 import java.io.BufferedWriter; 
     7 
     8 String filePath = System.getProperty("user.dir") + "/login.txt";
     9 log.info(System.getProperty("user.dir") + "/login.txt" );
    10 vars.put("filePath",filePath);
    11 File file = new File(filePath);
    12 
    13 try {
    14     if (file.exists()){
    15         file.delete();
    16     }
    17     file.createNewFile();
    18     FileWriter fs = new FileWriter(filePath,true);
    19     BufferedWriter bw = new BufferedWriter(fs);
    20 
    21     String token=vars.get("accessToken");
    22     log.info("写入的token:" + token);
    23     bw.write(token);
    24     bw.write(System.getProperty("line.separator"));
    25     fs.flush();
    26     bw.close();
    27     fs.close();
    28     
    29     
    30 }catch(IOException e) {
    31     e.printStackTrace();
    32 }

    csv的参数配置,这里就不赘述了,可以查看以前的博文,有详细介绍。

    在线程组2中引用csv元件,读取保存到文件中的token,csv配置如下:

    在信息头中引用token,配置如下:

    我们来运行脚本,查看下运行结果,是否成功?

    看如下截图,日志打印写入到文件中的token与线程组2请求传递的token是一样的,脚本运行成功,实现了token跨线程的调用。

    再来看下保存到文件中的token,如下:

    注意

    需要注意的是,多个线程间,将参数配置成了全局变量,但运行还是会报错,线程组间的接口请求乱序。此时,检查下测试计划里的配置,有个独立运行线程组的配置,如下所示。

  • 相关阅读:
    经典语录一
    例子二
    例子一
    模板加载
    vim 程序编辑器
    文件与文件系统的压缩,打包与备份
    Linux 磁盘与文件系统管理
    文件与目录操作
    Linux 的文件/目录权限
    Linux 指令代码,热键以及文件放置安排
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/12403480.html
Copyright © 2011-2022 走看看