前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JMeter5.1核心类ValueReplacer源码分析

JMeter5.1核心类ValueReplacer源码分析

原创
作者头像
天堂小说
发布2021-12-03 16:52:11
3650
发布2021-12-03 16:52:11
举报
文章被收录于专栏:JMeter源码分析

概述

ValueReplacer类是处理变量参数替换和内置操作函数的核心类,被PreCompile类调用。

源码解析

主要变量

代码语言:txt
复制
    // CompoundFunction类
    private final CompoundVariable masterFunction = new CompoundVariable();

    // 变量列表
    private Map<String, String> variables = new HashMap<>();

构造函数

默认构造函数

代码语言:txt
复制
    public ValueReplacer() {
    }

带TestPlan类的构造函数,将testPlan类中的变量存入变量列表

代码语言:txt
复制
    public ValueReplacer(TestPlan tp) {
        setUserDefinedVariables(tp.getUserDefinedVariables());
    }

主要方法

containsKey

代码语言:txt
复制
    boolean containsKey(String k){
        return variables.containsKey(k);
    }

setUserDefinedVariables

代码语言:txt
复制
    public void setUserDefinedVariables(Map<String, String> variables) {
        this.variables = variables;
    }

setProperties

将参数替换和内置函数处理后的JMeterProperty类,覆盖原来节点的JMeterProperty类

代码语言:txt
复制
    private void setProperties(TestElement el, Collection<JMeterProperty> newProps) {
        // 清除原来的JMeterProperty类属性
        el.clear();
        for (JMeterProperty jmp : newProps) {
            // 重新赋值
            el.setProperty(jmp);
        }
    }

replaceValues

用于参数变量和内置函数替换操作,被PerCompile类调用。

代码语言:txt
复制
    public void replaceValues(TestElement el) throws InvalidVariableException {
        // 调用ReplaceStringWithFunctions类对TestElement类的JMeterProperty属性进行替换
        Collection<JMeterProperty> newProps = replaceValues(el.propertyIterator(), new ReplaceStringWithFunctions(masterFunction,
                variables));
        setProperties(el, newProps);
    }

内部方法,通过ReplaceStringWithFunctions类进行参数替换,只对String和Number类型进行参数替换,对MultiProperty类型进行递归调用

代码语言:txt
复制
    private Collection<JMeterProperty> replaceValues(PropertyIterator iter, ValueTransformer transform) throws InvalidVariableException {
        List<JMeterProperty> props = new LinkedList<>();
        while (iter.hasNext()) {
            JMeterProperty val = iter.next();
            if (log.isDebugEnabled()) {
                log.debug("About to replace in property of type: {}: {}", val.getClass(), val);
            }       
            if (val instanceof StringProperty) {
                // Must not convert TestElement.gui_class etc
                if (!val.getName().equals(TestElement.GUI_CLASS) &&
                        !val.getName().equals(TestElement.TEST_CLASS)) {
                    // 参数替换
                    val = transform.transformValue(val);
                    log.debug("Replacement result: {}", val);
                }
            } else if (val instanceof NumberProperty) {
                val = transform.transformValue(val);
                log.debug("Replacement result: {}", val);
            } else if (val instanceof MultiProperty) {
                MultiProperty multiVal = (MultiProperty) val;
                // 递归调用
                Collection<JMeterProperty> newValues = replaceValues(multiVal.iterator(), transform);
                multiVal.clear();
                for (JMeterProperty jmp : newValues) {
                    multiVal.addProperty(jmp);
                }
                log.debug("Replacement result: {}", multiVal);
            } else {
                log.debug("Won't replace {}", val);
            }
            props.add(val);
        }
        return props;
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 源码解析
    • 主要变量
      • 构造函数
        • 主要方法
          • containsKey
            • setUserDefinedVariables
              • setProperties
                • replaceValues
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档