Search code examples
csvjmeterjexl

Jmeter- How to manipulate DateTime Type Variable?


We need to add n Minutes to a work order start time variable (WOStartTime) for every sample, what are possible ways?

Currently we are using jexl function in jp@gc - Parameterized Controller;

${__jexl(${__threadNum()}*8 + ${WOStartTime})}

where WOStartTime is a datetime fetched from a CSV file;

and getting following exception; 2014/05/20 15:44:11 ERROR - jmeter.functions.JexlFunction: An error occurred while evaluating the expression "1*8 + 5/20/2004 15:05" org.apache.commons.jexl.parser.ParseException: Encountered "15" at line 1, column 17. Was expecting one of: "||" ... "or" ... "&&" ... "and" ... "|" ... "^" ... "&" ... "==" ... "eq" ... "!=" ... "ne" ... "<" ... "lt" ... ">" ... "gt" ... "<=" ... "le" ... ">=" ... "ge" ... "+" ... "-" ... "*" ... "/" ... "div" ... "%" ... "mod" ... ";" ... at org.apache.commons.jexl.parser.Parser.generateParseException(Parser.java:4176)

We have added a BeanShell Preprocessor to manipulate datetime variable;

woStartDate=vars.get("WOStartTime");
StartTime=vars.get("Start");
EndTime=vars.get("End");


Date NewStartTime ; 


if (StartTime == null){
    StartTime =woStartDate;
    print("StartTime == null");
}
else    {
    NewStartTime=StartTime;
    NewStartTime.setTime(NewStartTime.getTime()+2); 
    StartTime=NewStartTime;

}


print(StartTime);

vars.put("Start", StartTime);

    EndTime=StartTime;
    EndTime.setTime(NewStartTime.getTime()+5); 
vars.put("End", EndTime);

StartTime is always NULL , but after vars.put("Start", StartTime) for second sample this should not be NULL, need help to resolve the issue;


Solution

  • It seems that you're having issues with your Beanshell script.

    1. JMeter variables come as String, you need to cast them to Date
    2. +2 and +5 operators are adding milliseconds, not minutes
    3. If one of variables in first 3 lines will be not set your script won't go on.

    Refer to updated script below for details and corrections:

        import java.text.SimpleDateFormat;
        import java.util.Calendar;
        import java.util.Date;
    
        vars.put("WOStartTime", "1970-01-01 12:00");
        vars.put("Start", "1970-01-01 12:00");
        vars.put("End", "1970-01-01 12:00");
        Date woStartDate = null;
        Date StartTime = null;
        Date EndTime = null;
    
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm");
    
        try {
            woStartDate = sdf.parse(vars.get("WOStartTime"));
        } catch (NullPointerException ex) {
            System.err.println("WOStartTime is not defined");
        }
        try {
            StartTime = sdf.parse(vars.get("Start"));
        } catch (NullPointerException ex) {
            System.err.println("Start variable is not defined");
        }
        try {
            EndTime = sdf.parse(vars.get("End"));
        } catch (NullPointerException ex) {
            System.err.println("End variable is not defined");
        }
    
    
        Date NewStartTime = null;
    
    
        if (StartTime == null) {
            StartTime = woStartDate;
            System.out.println(("StartTime == null"));
        } else {
            Calendar cal = Calendar.getInstance();
            cal.setTime(StartTime);
            cal.add(Calendar.MINUTE, 2);
            NewStartTime = cal.getTime();
            StartTime = NewStartTime;
    
        }
    
    
        System.out.println(StartTime);
    
        vars.put("Start", sdf.format(StartTime));
    
        EndTime = StartTime;
        if (NewStartTime != null) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(StartTime);
            cal.add(Calendar.MINUTE, 5);
            EndTime = cal.getTime();
        }
        vars.put("End", sdf.format(EndTime));
    

    If you add a Debug Sampler you'll see something like:

    JMeterVariables:
    JMeterThread.last_sample_ok=true
    End=1970-07-01 12:07
    Start=1970-02-01 12:02
    WOStartTime=1970-01-01 12:00
    

    See How to use BeanShell: JMeter's favorite built-in component guide for more Beanshell tips and tricks.

    Hope this helps.