Jmeter。 __base64Encode函数未在JSR223采样器中编码

时间:2018-07-31 20:02:50

标签: jmeter base64 decode

每次我需要在Jmeter中实现某些目标时,我都会用一个问题问... 简而言之:我的目标是逐行从csv文件中读取Base64编码的值,并将其保存到单独的变量中。根据{{​​3}}页(为了对其进行解码),有功能${__base64Encode}${__base64Decode}。我安装了this并重新启动了Jmeter。另一个引用Custom Jmeter Functions Plugin的建议是逐字逐句地使用JSR223 PostProcessor / Sampler:

  

建议对任何形式的脚本使用Groovy考虑   迁移到JSR223后处理器

所以我决定尝试一下。下面是我读取csv文件的脚本:

def csvFileLocation = new File("C://JohnDoe//MyWork//sensitive_data.csv")
def lines = csvFileLocation.readLines()
lines.eachWithIndex {line, idx ->
                     vars.put("Id_value_" + idx, line)
}

${__base64Decode(${Id_value_0}, first_variable)}
${__base64Decode(${Id_value_1}, second_variable)}
${__base64Decode(${Id_value_2}, third_variable)}

然后我看到了一些有趣的东西:

  

2018-01-01 12:30:60,767错误o.a.j.p.j.s.JSR223采样器:问题出在   JSR223脚本JSR223采样器,消息:javax.script.ScriptException:   org.codehaus.groovy.control.MultipleCompilationErrorsException:   启动失败:Script10.groovy:8:意外令牌:! @第8行   第1列!!ßïj[žÿ

我只是决定用字符串这是对base64编码的测试

,在this answer上对其进行测试

https://www.base64encode.org/


但是, Jmeter _base64Encode 函数会产生完全不同的结果:

vars.put("jmeter_variable", "this is the test of base64 encoding");

${__base64Encode(${jmeter_variable}, my_variable)}
log.info(${my_variable});

输出:

  

JHtqbWV0ZXJfdmFyaWFibGV9

enter image description here

我的问题:Jmeter使用哪种类型的编码算法?我是否可以借助 __ base64Decode 函数将已编码的值保存到csv文件中并将其恢复为原始值?感谢您的帮助...

1 个答案:

答案 0 :(得分:0)

您需要替换以下行:

${__base64Decode(${Id_value_0}, first_variable)}
${__base64Decode(${Id_value_1}, second_variable)}
${__base64Decode(${Id_value_2}, third_variable)}

有了这些:

vars.put('first_variable', vars.get('Id_value_0').decodeBase64() as String())
vars.put('second_variable', vars.get('Id_value_2').decodeBase64() as String())
vars.put('third_variable', vars.get('Id_value_2').decodeBase64() as String())

varsJMeterVariables类实例的简写,它提供对当前测试元素范围内的JMeter变量的读/写访问。

根据JSR223 Sampler documentation,您应该避免将JMeter函数和/或变量内联到Groovy脚本中,因为它们可能会分解为可能导致脚本编译失败(例如您的情况)或意外行为的内容。此外,它与Groovy的编译缓存功能不一致,因此即使从语法角度来看一切正常,您的Groovy脚本的性能也将是一个很大的问号。

因此,从Groovy的角度来看,最“自然”的方式将是使用String.decodeBase64() function,就像上面演示的那样。请参阅The Groovy Templates Cheat Sheet for JMeter文章,以了解Groovy还可以做些什么以及如何做。