jmeter之循环遍历器:多参数组合遍历

2023-12-18 14:33:36

测试场景

  • 接口有多个参数,每个参数有多个可取值,测试的时候需要对不同参数的值之间的组合进行遍历,这里提供一种参数化的遍历思路。

测试示例接口

  1. 引入springboot项目,写一个简单的示例接口。调用后返回入参。
@RequestMapping("/test")
@RestController
public class PersonController {
    @PostMapping("/add")
    public Person save(@RequestBody Person person1){
        System.out.println("姓名"+ person1.getName() + "\n" +"年龄" + person1.getAge() + "\n" +"工作" + person1.getJob());
        return person1;
    }
}
}
import lombok.Data;
@Data
public class Person {
    public String name;
    public int age;
    public String job;
}

  1. 将程序启动起来,接口入参和出参相同,如下:
{
  "name": "sicy""age":29,
  "job":"test"
}

jmeter实现方案

组合情况

  • 假设这三个字段分别可输入
    | name | na1 | na2 | na3 | na4 |
    | — | — | — | — | — |
    | age | 1 | 2 | 3 | 4 |
    | job | job1 | job2 | | |

  • 那么一共需要遍历442的这32中情况

脚本编写

  • 考虑在beanshell取样器中使用三个数组,分别存放三个字段的值,使用循环遍历将值通过vars传递给线程组
  • 线程里考虑使用三个循环遍历器,分别遍历这三个参数,考虑引入计数器作为下标取不同值

beanshell脚本如下:

//import java.util.Arrays;
//定义name,age和job数组
String[] name = new String []{"na1","na2","na3","na4"};
int[] age = new int []{1, 2, 3, 4};
String[] job = new String []{"job1","job2"};
//分别获取name,age和job的长度
int name_num = name.length;
int age_num = age.length;
int job_num = job.length;

//将name,age和job的长度设置变量传到线程组
vars.put("name_num",name_num.toString());
vars.put("age_num",age_num.toString());
vars.put("job_num",job_num.toString());

//将name,age和job每个值都设置为对应下标的变量:枚举赋值和循环赋值
int i = 0;
//循环方式将值传到线程组中
for(i = 0; i < name_num ; i++){
    //定义带下标的变量名。这里必须是(i+1),因为数组下标从1开始,为了好辨认对应关系,这里+1保持一致
    String si = "name_"+ (i+1).toString();
    //打印变量名称
    log.error(si);
    //将name每个索引的值赋给线程组里面可用的name_对应下标的变量
    vars.put(si, name[i]);
    //打印对应下标变量值
    log.error(vars.get(si));
}

//age循环赋值,产生age_下标的线程组内变量
int j = 0;
//循环方式将值传到线程组中
for(j = 0; j < age_num ; j++){
    //定义带下标的变量名。这里必须是(j+1),因为数组下标从1开始,为了好辨认对应关系,这里+1保持一致
    String si = "age_"+ (j+1).toString();
    //打印变量名称
    log.error(si);
    vars.put(si, age[j].toString());
    log.error(vars.get(si));
}

int k = 0;
//循环方式将值传到线程组中
for(k = 0; k < job_num ; k++){
    //定义带下标的变量名。这里必须是(j+1),因为数组下标从1开始,为了好辨认对应关系,这里+1保持一致
    String si = "job_"+ (k+1).toString();
    //打印变量名称
    log.error(si);
    vars.put(si, job[k]);
    log.error(vars.get(si));
}

枚举赋值
//vars.put("name_1",name[0]);
//vars.put("name_2",name[1]);
//vars.put("name_3",name[2]);
//vars.put("name_4",name[3]);

//vars.put("age_1",age[0]);
//vars.put("age_2",age[1]);
//vars.put("age_3",age[2]);
//vars.put("age_4",age[3]);

//vars.put("job_1",job[0]);
//vars.put("job_2",job[1]);

  • 代码部分分析
//先定义三个数组,把值放进去,如name
String[] name = new String []{"na1","na2","na3","na4"};
//再分别获取这三个数组的长度,使用.length
//使用vars.put将长度传入线程组,作为计数器的max值
//然后通过循环的方式,创建多个线程组变量,每个变量通过下标标记值和数组元素之间的对应关系。
//用到的方法:
.length
vars.put()
log.error()
toString()

线程组如下:
image.png

  • 引入beanshell取样器,将变量先创建并赋值好
  • 使用三个循环遍历器,每个遍历器遍历对应的参数。循环次数等于数组的元素个数

image.png

  • 每个遍历器中放置计数器,通过下标取每个变量的值

image.png

  • 请求体的每个参数是变量名_计数器的形式

通过函数助手中的__V方法实现变量的嵌套引用
image.png

通过这种方法就可以实现多个参数之间的组合遍历了

  • 另外通过用户自定义的变量,也可以达到产生不同下标变量的目的

文章来源:https://blog.csdn.net/sicychen/article/details/132757771
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。