每次我需要在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上对其进行测试但是, Jmeter _base64Encode 函数会产生完全不同的结果:
vars.put("jmeter_variable", "this is the test of base64 encoding");
${__base64Encode(${jmeter_variable}, my_variable)}
log.info(${my_variable});
输出:
JHtqbWV0ZXJfdmFyaWFibGV9
我的问题:Jmeter使用哪种类型的编码算法?我是否可以借助 __ base64Decode 函数将已编码的值保存到csv文件中并将其恢复为原始值?感谢您的帮助...
答案 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())
vars
是JMeterVariables类实例的简写,它提供对当前测试元素范围内的JMeter变量的读/写访问。
根据JSR223 Sampler documentation,您应该避免将JMeter函数和/或变量内联到Groovy脚本中,因为它们可能会分解为可能导致脚本编译失败(例如您的情况)或意外行为的内容。此外,它与Groovy的编译缓存功能不一致,因此即使从语法角度来看一切正常,您的Groovy脚本的性能也将是一个很大的问号。
因此,从Groovy的角度来看,最“自然”的方式将是使用String.decodeBase64() function,就像上面演示的那样。请参阅The Groovy Templates Cheat Sheet for JMeter文章,以了解Groovy还可以做些什么以及如何做。