JMeter - Hitting specific endpoints based on user credentials via multiple CSV files

311 Views Asked by At

My JMeter test:

  • Iterate over a CSV file (logins.csv) with login credentials, and their unique identifier user a CsvDataSetConfig
  • Sign in
  • Based on the login credentials (unique identifier from logins.csv), identify and load a second file in the format of <user_identifier>_invoices.csv which then has the necessary path to view an invoice for that user.

Simplified test setup:

ThreadGroup
> CsvDataSetConfig - file: logins.csv, variables: user_identifier,email,password, sharing_mode: all threads
> `SignIn` TransactionController using email and password from above CSV file to login via series of HTTP Requests
> UserParameters - USER_IDENTIFIER,INVOICE_CSV_FOR_USER
> BeanShellSampler
  props.setProperty("USER_IDENTIFIER", vars.get("user_identifier"));
  props.setProperty("INVOICE_CSV_FOR_USER","${__P(USER_IDENTIFIER)}_invoices.csv");
> WhileController - condition: ${__javaScript("${invoice-id}" != "<EOF>",)}
  > CsvDataSetConfig - file: ${__P(INVOICE_CSV_FOR_USER,)}, variables: invoice-id, sharing_mode: current thread
  > `ViewInvoice` TransactionController with HTTP Request to url `../${invoice-id}`

# logins.csv
c7beaa99c6d99fa7754fc2213f9b17b8,[email protected],password321
9c8466bee65e39c9d3cf715e42933c3b,[email protected],password456

# c7beaa99c6d99fa7754fc2213f9b17b8_invoices.csv
f54eca1cbbba4a97c1dc459e0ba64970
0024f2cdf28dd7ebf3606988fd229afd

# 9c8466bee65e39c9d3cf715e42933c3b_invoices.csv
64f725fdeb2980b28bdf5e02076a55cd
60ac45a12ea3d6b59c2cb82f27da1722

Problem:

  • In local JMeter, seeing requests to invoice urls being made with incorrect invoice-id for the business. So seems the parameters are not being treat correctly between threads.
  • In BlazeMeter, seeing the content of the while controller never being hit.

I've tried loop controllers, having 50 rows per _invoices.csv file, but not got anywhere with that either. I also originally started off with User Defined Variables rather than User Parameters, but the latter seems to be what I should be using for this use case.

1

There are 1 best solutions below

0
Ori Marko On

Threads are running at the same time and sharing JMeter properties.

In your test plan each thread sets the property USER_IDENTIFIER. So this and other property can/will be overriden by different thread(s) and create inconsistency.

I suggest you save (and get) in variables which aren't shared by threads:

 vars.put("USER_IDENTIFIER", vars.get("user_identifier"));

 vars.put("INVOICE_CSV_FOR_USER"," ${USER_IDENTIFIER}_invoices.csv");

Also about beanshell, JMeter advice to change to JSR223

Since JMeter 3.1, we advise switching from BeanShell to JSR223 Test Elements (see JSR223 section below for more details), and switching from __Beanshell function to __groovy function.