无法在使用Jmeter的JSR223预处理器中的groovy脚本创建的采样器的HTTP请求中传递变量值

时间:2019-12-10 12:34:57

标签: groovy jmeter preprocessor jsr223

我试图在JSR223预处理器中使用groovy脚本创建哈希,然后将其传递给父HTTP请求的主体数据,但是我不确定我在哪里做错了。当我在线程组中有一个HTTP请求时,它不起作用,但是如果有两个HTTP请求,则它对第二个请求起作用。 注意:在第一个请求之后将设置变量HASH。尽管我已经尝试将预处理器作为第一个HTTP请求的子级,或者将其放在HTTP请求之前的线程组中,但是没有任何效果。

脚本数据:

import java.security.MessageDigest
def requestBody = sampler.getArguments().getArgument(0).getValue()
def data = new XmlParser().parseText(requestBody)
String method=data.method.text()
String token=data.token.text()
String time=data.time.text()
String xyz ='method'+method+'token'+token+'time'+time+'3VDEY-6ZHLH-D27C0-T2ALI'
String hash = MessageDigest.getInstance("MD5").digest(xyz.bytes).encodeHex().toString()
vars.put("HASH", hash)

HTTP请求正文数据:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <method>ping</method>
    <token>-</token>
    <time>1575542978</time>
    <signature>${HASH}</signature>
    <params/>
</root>

测试计划图片

https://drive.google.com/file/d/1vGbwyDo8eWUDL7EDZlK8bdbApxtFpWGT/view?usp=sharing https://drive.google.com/file/d/1Us6tSuRw6MJ__YrnX0tTCKL8S9QSgp-v/view?usp=sharing https://drive.google.com/file/d/10hobprJcga6_y23VWd5U3X1aaSEXzGkb/view?usp=sharing

2 个答案:

答案 0 :(得分:0)

这听起来像是JMeter中的错误,我建议通过JMeter Bugzilla提出问题

同时,您可以通过直接在请求正文中替换JMeter Variable并将新生成的哈希替换为“旧”请求正文来进行操作。

建议的代码修订:

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <button type="button" @click="btnOnClick">Add</button>
  <table class="table table-striped table-hover table-bordered mainTable" id="Table">
    <thead>
      <tr>
        <th class="itemName">Item Name</th>
        <th>Quantity</th>
        <th>Selling Price</th>
        <th>Amount</th>
      </tr>
    </thead>
    <tbody>
      <form-row v-for="(row, key) in tableDatas" :key="key" v-bind.sync="row"></form-row>
    </tbody>
  </table>
  <div>
    <label>Total Row's Amount</label>
    <input type="text" disabled :value="calculate">
  </div>
</div>

<script type="text/x-template" id="row-template">
  <tr>
    <td>
      <input class="form-control" readonly :value="itemname" />
    </td>
    <td>
      <input class="form-control text-right" type="number" min="0" step="1" v-model="quantitySynced" />
    </td>
    <td>
      <input class="form-control text-right" type="number" min="0" step=".5" v-model="sellingpriceSynced" />
    </td>
    <td>
      <input readonly class="form-control text-right" type="number" min="0" step="1" :value="amountSynced" />
    </td>
  </tr>
</script>

有关JMeter中Groovy脚本的更多信息:Apache Groovy - Why and How You Should Use It

答案 1 :(得分:0)

提供屏幕快照或测试计划树的文本表示可能会有帮助,因为我怀疑您的范围存在问题。

作为解决方法,您可以将JSR223预处理器替换为JSR223采样器,然后以正确的顺序将其放入测试计划中。为避免该采样器出现在结果中,您可以将JSR223 PostProcessor附加到prev.setIgnore()