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