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,如下:

    注意

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

  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/12403480.html
Copyright © 2011-2022 走看看