如何在JMeter中签名?

时间:2016-06-07 18:35:14

标签: ruby time jmeter performance-testing

对于单个调用,我有类似的ruby代码来生成API请求:

api_key = 'some-key-here'
shared_secret = 'very-secretive-secret'

timestamp = Time.now.to_i.to_s
sig = Digest::MD5.hexdigest( api_key+shared_secret+timestamp )

request_url = "#{production_point}/#{request}?apikey=#{api_key}&sig=#{sig}&format=json"
puts request_url

但生成的request_url仅在相对较短的时间内依赖于当前时间戳。

现在我需要进行一些性能测试,在JMeter中,我曾经使用过一个带有URL /请求/关键字列表的文件,我需要使用静态URL来解决服务器问题。现在我需要测试一项服务,该服务要求按照上述方式对每个请求进行签名,并且我不能只使用列表。

我知道JMeter中有一个md5功能。但是我在哪里放api_key和shared_secret(秘密本身不是URL的一部分)。

请有人,请指导我为需要使用需要时间戳的md5-ed签名签署每个请求的服务设置JMeter测试吗?

1 个答案:

答案 0 :(得分:2)

您可以使用“Beanshell”测试元素之一,即Beanshell PreProcessor,以便在请求之前生成正确的签名值。

  1. 将Beanshell PreProcessor作为执行该API调用的HTTP请求的子项添加
  2. 将以下代码放入PreProcessor的“脚本”区域(它基本上是Beanshell等同于您的Ruby脚本)

    import org.apache.commons.codec.digest.DigestUtils;
    
    String api_key = "some-key-here";
    String shared_secret = "very-secretive-secret";
    long timestamp = System.currentTimeMillis()/1000;
    
    String sig = DigestUtils.md5Hex(api_key + shared_secret + timestamp);
    
    vars.put("sig", sig);
    
    log.info("Signature: " + sig);
    
  3. 将生成的签名值引用为${sig},因为它已存储到JMeter Variable中。

  4. 演示: Beanshell MD5

    参考文献: