5
votes

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

4

4 Answers

1
votes

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.

1
votes

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}"
   }
}
1
votes

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:

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

0
votes

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: