JMeter5.1核心类ValueReplacer源码分析

2021-12-03 16:52:11 浏览数 (1)

概述

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;
    }

0 人点赞