JMeter 判断字符串是否存在该集合(List 或数组)

在学习 JMeter 的 JDBC 模块中,遇到了 ArrayList 和 String 的之间需要对比的问题,折腾我一周时间了。这个问题如果用代码解决的话,一个 for 循环就能搞掂,但在 JMeter 中就比较麻烦了。因为在 JMeter 界面上,一定得数字或字符串,才能进行对比,其他类型是不能对比的。以下的2种解决方案是分别使用 BeanShell 和函数解决的。

问题:

如何在 JMeter 中判断字符串是否在集合(List)或数组里面?集合和数组的大小不定,匹配的字符串位置也不定或者没有。

例子:

在测试前,我们需要在一个数据表(table)准备一些测试数据,但如果这个表已存在,那就无需创建了,直接对表进行修改,增减数据即可。

问题分析:

首先,我们不知道整个数据库的表有多少个?也不知道我们要创建的数据表是否存在,如果存在,那在哪个位置呢?那怎么完成ArrayList 和 String的对比呢,使用JMeter 组件还是代码解决?

初步解决方案:

先使用SHOW TABLES;查询数据库所有数据表,将每一个表的名称分解成一个字符串,这样比较就容易多了。

BeanShell 解决方案

1、查询当前数据库的表

在 JMeter 创建一个 JDBC Request,查询数据库当前所有的表名,并将其保存到tables这个变量中。

JDBC Request.png

2、添加 BeanShell 后置处理器,使用代码进行比较

对上述的 JDBC Request 添加一个 BeanShell 的后置处理器,进行代码处理,最后对isTableExist变量进行判断即可(true 为表已创建,false 为表未创建)。

BeanShell PostProcessor.png

一并贴上 BeanShell 代码

//将数据库的表名与创建的表名一一比较,如存在,不创建,如不存在,则创建数据表

//获取当前数据库的表数目
int tablesNum = Integer.parseInt(vars.get("tables_#"));
//默认为 false
boolean isTableExist = false;
log.info("数据表数目:" + tablesNum.toString());
if(tablesNum != 0) {
    String buildTable = vars.get("testTable");
    //对整个数据库的表名与需创建的表名一一比较
    for(int i=1; i<=tablesNum; i++) {
        String table = vars.get("tables_"+i);
        //如果数据库存在该表,则为 true
        if(buildTable.equals(table)) {
            isTableExist = true;
        }
    }
}
String isExist = Boolean.toString(isTableExist);
//isTableExist 是false,则需创建,如为 true,则无需创建
vars.put("isTableExist",isExist);
log.info("【" + vars.get("testTable") + "】数据表是否存在数据库中:" + isExist);

3、调用isTableExist

在创建数据表时,可根据isTableExist的值来判断是否需要创建表。可在 If Controler 控制器上使用,如下图所示:

if_Controler.png

函数解决方案

这个解决方案其实就是将上述代码整理成一个函数,这样在 JMeter 调用就方便多了,不用每次都需要复制编写 BeanShell 代码,增加错误率,使用也更便捷一些。

1、查询当前数据库的表,并将表的结果保存到变量中

第一步与 BeanShell 解决方案大同小异,主要是保存的变量不一样而已。当然也可以跟第一步一样,只不过需要函数做出相应的改动,这一块就留给大家练练手。

JDBC Request2.png

2、编写函数

编写函数的过程就不在这里赘述了,大家对 JMeter 函数开发不熟悉的话,可以百度一下,资料大把。
按照惯例,还是贴上代码给大家吧。

package com.dc.functions.functions;

import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

public class FindTableInDataBase extends AbstractFunction {

    private static final Logger log = LoggerFactory.getLogger(FindTableInDataBase.class);
    //显示的参数名字
    private static final List<String> desc = new LinkedList<>();
    static {
        desc.add("DataBase Result Variable Name");
        desc.add("DataBase Name");
        desc.add("Table Name");
    }
    //显示的函数名字
    private static final String KEY = "__FindTableInDataBase";
    //参数值
    private Object[] values;

    @Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        JMeterVariables variabless = getVariables();

        if (values.length != desc.size()) {
            log.warn("输入的参数不是" + desc.size() + "个,请检查参数。");
            return null;
        }

        String dbResultVName = ((CompoundVariable)this.values[0]).execute().trim();
        String dbName = ((CompoundVariable)this.values[1]).execute().trim();
        String testTableName = ((CompoundVariable)this.values[2]).execute().trim();
        String mapKey = "Tables_in_" + dbName;
        boolean isExist = false;
        List<Map<String, Object>> tablesList = (ArrayList<Map<String, Object>>) variabless.getObject(dbResultVName);
        log.info("数据库【" + dbName + "】的数据表:" + tablesList.toString());
        log.info("----------------------------");
        for (int i = 0; i < tablesList.size(); i ++) {
            Map<String, Object> tableMap = tablesList.get(i);
            if (tableMap.get(mapKey).equals(testTableName)) {
                isExist = true;
                log.info("数据表【" + testTableName + "】存在于数据库【" + dbName + "】");
            }
        }
        log.info("----------------------------");
        if (isExist == false) {
            log.info("在数据库【" + dbName + "】查找不到数据表【" + testTableName + "】");
        }
        return Boolean.toString(isExist);
    }

    //设置参数值
    @Override
    public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
        checkMinParameterCount(collection, 3);
        checkParameterCount(collection, 3);
        this.values = collection.toArray();
    }

    //返回函数名字
    @Override
    public String getReferenceKey() {
        return KEY;
    }

    //返回参数名字
    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }
}

在你的函数开发工程里,创建一个名为FindTableInDataBase的类,并将上述代码粘贴到该java 文件,然后编译工程,将 jar 包放到${JMeter_Home}/lib/ext路径上,重启 JMeter 即可。

3、调用函数

在判断是否需要需要创建数据表时,在 If Controler 控制器上直接调用该函数,根据返回的结果与预期值比对,即可得出是否需要创建数据表。

if_Controler2.png

总结

以上2种方案是我目前能想到解决方案,也是根据我最近学的知识所总结出来的,可能还有其他更加好的方法,期待与大家一同讨论进步。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容