How do i remove empty parameter using beanshell preprocessor in jmeter

主宰稳场 提交于 2019-12-23 12:43:24

问题


I am trying to read a csv file that contains more that 500+ rows and each row will serve as request to API. Now my problem is that some of the parameters have empty string and i would like to set up a condition in case if parameter returns empty string then remove that parameter from request body upfront before hitting the API

Below is my json

{
  "body": {
    "Id1": "${Id1}",
    "addressId": "${addressId}",
    "languageCode": "${languageCode}",
    "tempId": "${tempId}"
}

Now after reading csv i get following values in my request body

{
  "body": {
    "Id1": "1",
    "addressId": "1233",
    "languageCode": "E",
    "tempId": ""
}

As you can see tempId has empty string. Now using bean-shell preprocessor i am trying to remove this but no luck

Object requestBody = sampler.getArguments().getArgument(0).getValue();

if (requestBody.get("tempId").equals("")){
    sampler.getArguments.removeArgument("tempId");
}

when i look into result tree i don't see tempId being deleted from the request. I would appreciate any help


回答1:


Avoid using Beanshell for deprecation and bad performance.

Use groovy instead with this code:

import org.apache.jmeter.config.Arguments;
def request = new groovy.json.JsonSlurper().parseText(sampler.getArguments().getArgument(0).getValue())
def newRequest = evaluate(request.inspect())
request.body.each { entry ->
    if (entry.getValue().equals('')) {
        newRequest.body.remove(entry.getKey())
    }
}
def arguments = new Arguments();
sampler.setArguments(arguments);
sampler.addNonEncodedArgument('', new groovy.json.JsonBuilder(newRequest), '')
sampler.setPostBodyRaw(true)

See:

  • JsonSlurper
  • JsonBuilder

If you're looking to learn jmeter correctly, this book will help you.




回答2:


Replace in body "tempId": "${tempId}" with ${tempIdEval} and calculate value in JSR223 script

String tempIdEval = vars.get("tempId");
vars.put("tempIdEval", (port == null ? "" : "\"tempId\": \"" + tempIdEval + "\""));  

Migration to JSR223 PreProcessor+Groovy is highly recommended for performance, support of new Java features and limited maintenance of the BeanShell library.




回答3:


Since you are using beanshell preprocessor, we can use like

   if (vars.get("tempId")!="")
       vars.put("variablename","not null");

   else 
       vars.put("variablename","is null");

and use the "variablename" instead. You can manipulate the string as well as below.

if (${tempId}=="")
{ vars.put("json","
   {
   "body": {
    "Id1": "${Id1}",
    "addressId": "${addressId}",
    "languageCode": "${languageCode}""
   }
}
else
{ vars.put("json","
   {
   "body": {
    "Id1": "${Id1}",
    "addressId": "${addressId}",
    "languageCode": "${languageCode}",
    "tempId": "${tempId}"
   }
}



回答4:


Be aware that since JMeter 3.1 it's recommended to use JSR223 Test Elements and Groovy language

The relevant Groovy code for JSR223 PreProcessor which removes JSON attributes with empty values would be something like:

def request = new groovy.json.JsonSlurper().parseText(sampler.getArguments().getArgument(0).getValue())
def newRequest = evaluate(request.inspect())
request.body.each { entry ->
    if (entry.getValue().equals('')) {
        newRequest.body.remove(entry.getKey())
    }
}
sampler.getArguments().removeAllArguments()
sampler.addNonEncodedArgument('', new groovy.json.JsonBuilder(newRequest).toPrettyString(), '')
sampler.setPostBodyRaw(true)

More information:

  • Groovy: Parsing and producing JSON
  • Apache Groovy - Why and How You Should Use It


来源:https://stackoverflow.com/questions/59060041/how-do-i-remove-empty-parameter-using-beanshell-preprocessor-in-jmeter

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!