apache / jmeter

Apache JMeter open-source load testing tool for analyzing and measuring the performance of a variety of services
https://jmeter.apache.org/
Apache License 2.0
8.37k stars 2.1k forks source link

Non deterministic behaviour for Constant Throughput Timer and wrongly set value (via variable) #5436

Open asfimport opened 3 years ago

asfimport commented 3 years ago

piotr.mirek (Bug 64928): Component impacted:

Case:

Currently there is no validation against given value when the test runs. No error is presented to the user and it's not easy to pinpoint the issue.

Solution:

There should be a check against the value of the variable when value of the variable/property is assigned to mentioned component, to make sure that the value is positive float number or similar.

Severity: normal OS: All

asfimport commented 3 years ago

@FSchumacher (migrated from Bugzilla): Created attachment bug64928-throughput-controller-paring.jmx: Simple test plan with througput controller and "unknown" var

bug64928-throughput-controller-paring.jmx ````xml false true false continue false 1 1 1 false true false saveConfig true true true true true true true false true true false false false true false false false true 0 true true true true true true 0 false ${thing} ThroughputController.percentThroughput 1.0 0.0 true "OK" groovy ````
asfimport commented 3 years ago

@FSchumacher (migrated from Bugzilla): Thanks for the report. When I configure a simple test plan (attached) with an invalid var and run the plan, I get a lot of warnings in the logs:

2020-11-18 11:48:08,076 WARN o.a.j.c.ThroughputController: Error parsing '${thing}' java.lang.NumberFormatException: For input string: "${thing}" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[?:1.8.0_201] at java.lang.Integer.parseInt(Integer.java:569) ~[?:1.8.0_201] at java.lang.Integer.parseInt(Integer.java:615) ~[?:1.8.0_201] at org.apache.jmeter.control.ThroughputController.getMaxThroughputAsInt(ThroughputController.java:131) [ApacheJMeter_components.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.ThroughputController.decide(ThroughputController.java:190) [ApacheJMeter_components.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.ThroughputController.iterationStart(ThroughputController.java:229) [ApacheJMeter_components.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.GenericController.fireIterationStart(GenericController.java:399) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.GenericController.fireIterEvents(GenericController.java:391) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.GenericController.next(GenericController.java:160) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.LoopController.next(LoopController.java:134) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.threads.AbstractThreadGroup.next(AbstractThreadGroup.java:91) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:254) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201] 2020-11-18 11:48:08,083 WARN o.a.j.c.ThroughputController: Error parsing '${thing}' java.lang.NumberFormatException: For input string: "${thing}" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[?:1.8.0_201] at java.lang.Integer.parseInt(Integer.java:569) ~[?:1.8.0_201] at java.lang.Integer.parseInt(Integer.java:615) ~[?:1.8.0_201] at org.apache.jmeter.control.ThroughputController.getMaxThroughputAsInt(ThroughputController.java:131) [ApacheJMeter_components.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.ThroughputController.isDone(ThroughputController.java:202) [ApacheJMeter_components.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.GenericController.next(GenericController.java:162) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.ThroughputController.next(ThroughputController.java:180) [ApacheJMeter_components.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.GenericController.nextIsAController(GenericController.java:222) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.GenericController.next(GenericController.java:175) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.control.LoopController.next(LoopController.java:134) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.threads.AbstractThreadGroup.next(AbstractThreadGroup.java:91) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:254) [ApacheJMeter_core.jar:5.3.1-SNAPSHOT] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201] 2020-11-18 11:48:08,084 WARN o.a.j.c.ThroughputController: Error parsing '${thing}'

Are these not enough? How could this be enhanced?

If negative numbers are given, no warning is emitted, though. I think a warning would help here, but then again, where and how should that be warned about?

asfimport commented 3 years ago

piotr.mirek (migrated from Bugzilla): It's not that component. You were testing -> logic controller -> Throughput Controller I was referring -> timers -> Constant Throughput Timer My bad, the title should be updated, though it was correctly stated in the descriptions. Please see attachments with .jmx file and logs

asfimport commented 3 years ago

piotr.mirek (migrated from Bugzilla): test case with the issue

Created attachment z.jmx: test case with the issue

z.jmx ````xml false true false empty = negative -1 = string test = continue false 1 1 1 false true false true false 2 ${empty} continue false 1 1 1 false true false true false 2 ${negative} continue false 1 1 1 false true false true false 2 ${string} false saveConfig true true true true true true true false true true false false false true false false false true 0 true true true true true true ````
asfimport commented 3 years ago

piotr.mirek (migrated from Bugzilla): Created attachment logs.txt: logs from logs viewer

logs.txt ```` logs from case 1 (empty value) 2020-11-18 11:19:44,520 INFO o.a.j.e.StandardJMeterEngine: Running the test! 2020-11-18 11:19:44,523 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2020-11-18 11:19:44,523 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2020-11-18 11:19:44,530 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must contain the string: '.functions.' 2020-11-18 11:19:44,531 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must not contain the string: '.gui.' 2020-11-18 11:19:45,428 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, *local*) 2020-11-18 11:19:46,057 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : case1 2020-11-18 11:19:46,058 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group case1. 2020-11-18 11:19:46,059 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2020-11-18 11:19:46,060 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2020-11-18 11:19:46,068 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2020-11-18 11:19:46,069 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started 2020-11-18 11:19:46,074 INFO o.a.j.t.JMeterThread: Thread started: case1 1-1 logs from case 2 (negative value) 2020-11-18 11:21:11,450 INFO o.a.j.e.StandardJMeterEngine: Running the test! 2020-11-18 11:21:11,450 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2020-11-18 11:21:11,453 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, *local*) 2020-11-18 11:21:12,019 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : case2 2020-11-18 11:21:12,020 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group case2. 2020-11-18 11:21:12,020 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2020-11-18 11:21:12,020 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2020-11-18 11:21:12,021 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2020-11-18 11:21:12,021 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started 2020-11-18 11:21:12,024 INFO o.a.j.t.JMeterThread: Thread started: case2 1-1 2020-11-18 11:21:12,030 INFO o.a.j.t.JMeterThread: Thread is done: case2 1-1 2020-11-18 11:21:12,031 INFO o.a.j.t.JMeterThread: Thread finished: case2 1-1 2020-11-18 11:21:12,031 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test 2020-11-18 11:21:12,031 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, *local*) logs from case 3 (string value) 2020-11-18 11:21:50,783 INFO o.a.j.e.StandardJMeterEngine: Running the test! 2020-11-18 11:21:50,784 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2020-11-18 11:21:50,792 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, *local*) 2020-11-18 11:21:51,253 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : case3 2020-11-18 11:21:51,253 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group case3. 2020-11-18 11:21:51,253 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2020-11-18 11:21:51,253 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2020-11-18 11:21:51,255 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2020-11-18 11:21:51,255 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started 2020-11-18 11:21:51,258 INFO o.a.j.t.JMeterThread: Thread started: case3 1-1 ````
asfimport commented 3 years ago

@FSchumacher (migrated from Bugzilla): I found no other solution for the problem, other than to add a validator function passed to the TestBean framework. The problem I faced, was that I couldn't decide at neither ConstantThroughputTimer#setProperty nor #setThroughput, whether the value it got, was already completely filled in.

Maybe someone else knows a better way to add the validation logic to this class (and other classes that are using the BeanInfo construct).

Would you be able to test the patch for yourself and report back, if it would help your case?

Created attachment add-validate-function-to-testhelper.patch: Add a validate function to the TestBean framework

add-validate-function-to-testhelper.patch ````diff diff --git a/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java b/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java index 0d28dffb43..19c53af136 100644 --- a/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java +++ b/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java @@ -18,14 +18,19 @@ package org.apache.jmeter.timers; import java.beans.PropertyDescriptor; +import java.util.function.Function; import org.apache.jmeter.testbeans.BeanInfoSupport; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * BeanInfo for the ConstantThroughputTimer. */ public class ConstantThroughputTimerBeanInfo extends BeanInfoSupport { + private static Logger log = LoggerFactory.getLogger(ConstantThroughputTimerBeanInfo.class); + public ConstantThroughputTimerBeanInfo() { super(ConstantThroughputTimer.class); @@ -36,10 +41,23 @@ public class ConstantThroughputTimerBeanInfo extends BeanInfoSupport { PropertyDescriptor p = property("throughput"); //$NON-NLS-1$ p.setValue(NOT_UNDEFINED, Boolean.TRUE); p.setValue(DEFAULT, 0.0); + p.setValue(VALIDATOR, (Function) ConstantThroughputTimerBeanInfo::validateThroughput); p = property("calcMode", ConstantThroughputTimer.Mode.class); //$NON-NLS-1$ p.setValue(DEFAULT, ConstantThroughputTimer.Mode.ThisThreadOnly.ordinal()); p.setValue(NOT_UNDEFINED, Boolean.TRUE); // must be defined } + private static boolean validateThroughput(Object o) { + try { + double value = Double.parseDouble(o.toString()); + if (value < 0) { + log.warn("Number must not be less than zero: [{}]", value); + } + } catch (NumberFormatException e) { + log.warn("No valid number: [{}]", o); + } + return false; + } + } diff --git a/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java b/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java index 5971b31ef2..a00dc0717a 100644 --- a/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java +++ b/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java @@ -91,6 +91,9 @@ public abstract class BeanInfoSupport extends SimpleBeanInfo { /** TextEditor property */ public static final String TEXT_LANGUAGE = GenericTestBeanCustomizer.TEXT_LANGUAGE; + /** An optional validator, that is a Function **/ + public static final String VALIDATOR = GenericTestBeanCustomizer.VALIDATOR; + /** The BeanInfo for our class as obtained by the introspector. */ private final BeanInfo rootBeanInfo; diff --git a/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java b/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java index fa19b19d8c..16b4a848fc 100644 --- a/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java +++ b/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java @@ -25,6 +25,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; +import java.util.function.Function; import org.apache.jmeter.testbeans.gui.GenericTestBeanCustomizer; import org.apache.jmeter.testbeans.gui.TableEditor; @@ -83,6 +84,7 @@ public class TestBeanHelper { Class type = desc.getPropertyType(); Object value = unwrapProperty(desc, jprop, type); + validateObjectValue(desc, jprop, value); if (log.isDebugEnabled()) { log.debug("Setting {}={}", jprop.getName(), value); } @@ -105,6 +107,17 @@ public class TestBeanHelper { } } + private static void validateObjectValue(PropertyDescriptor desc, JMeterProperty jprop, Object value) { + Object validator = desc.getValue(BeanInfoSupport.VALIDATOR); + if (validator instanceof Function) { + @SuppressWarnings("unchecked") + Function validatorFunction = (Function) validator; + if (!validatorFunction.apply(value)) { + log.warn("Invalid value [{}] for property [{}]", value, jprop.getName()); + } + } + } + private static Object unwrapProperty(PropertyDescriptor desc, JMeterProperty jprop, Class type) { Object value; if(jprop instanceof TestElementProperty) diff --git a/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java b/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java index 25ee55cfb5..e3aca1ad6e 100644 --- a/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java +++ b/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java @@ -96,7 +96,7 @@ import org.slf4j.LoggerFactory; * */ public class GenericTestBeanCustomizer extends JPanel implements SharedCustomizer { - private static final long serialVersionUID = 241L; + private static final long serialVersionUID = 242L; private static final Logger log = LoggerFactory.getLogger(GenericTestBeanCustomizer.class); @@ -160,6 +160,8 @@ public class GenericTestBeanCustomizer extends JPanel implements SharedCustomize public static final String DEFAULT_GROUP = ""; + public static final String VALIDATOR = "validator"; + @SuppressWarnings("unused") // TODO - use or remove private int scrollerCount = 0; ````
asfimport commented 3 years ago

@FSchumacher (migrated from Bugzilla): Forgot to add the return for the valid value. Doh.

Created attachment add-validate-function-to-testhelper.patch: Add a validate function to the TestBean framework

add-validate-function-to-testhelper.patch ````diff diff --git a/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java b/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java index 0d28dffb43..6cc82142d7 100644 --- a/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java +++ b/src/components/src/main/java/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java @@ -18,14 +18,19 @@ package org.apache.jmeter.timers; import java.beans.PropertyDescriptor; +import java.util.function.Function; import org.apache.jmeter.testbeans.BeanInfoSupport; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * BeanInfo for the ConstantThroughputTimer. */ public class ConstantThroughputTimerBeanInfo extends BeanInfoSupport { + private static Logger log = LoggerFactory.getLogger(ConstantThroughputTimerBeanInfo.class); + public ConstantThroughputTimerBeanInfo() { super(ConstantThroughputTimer.class); @@ -36,10 +41,25 @@ public class ConstantThroughputTimerBeanInfo extends BeanInfoSupport { PropertyDescriptor p = property("throughput"); //$NON-NLS-1$ p.setValue(NOT_UNDEFINED, Boolean.TRUE); p.setValue(DEFAULT, 0.0); + p.setValue(VALIDATOR, (Function) ConstantThroughputTimerBeanInfo::validateThroughput); p = property("calcMode", ConstantThroughputTimer.Mode.class); //$NON-NLS-1$ p.setValue(DEFAULT, ConstantThroughputTimer.Mode.ThisThreadOnly.ordinal()); p.setValue(NOT_UNDEFINED, Boolean.TRUE); // must be defined } + private static boolean validateThroughput(Object o) { + try { + double value = Double.parseDouble(o.toString()); + if (value < 0) { + log.warn("Number must not be less than zero: [{}]", value); + return false; + } + return true; + } catch (NumberFormatException e) { + log.warn("No valid number: [{}]", o); + } + return false; + } + } diff --git a/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java b/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java index 5971b31ef2..a00dc0717a 100644 --- a/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java +++ b/src/core/src/main/java/org/apache/jmeter/testbeans/BeanInfoSupport.java @@ -91,6 +91,9 @@ public abstract class BeanInfoSupport extends SimpleBeanInfo { /** TextEditor property */ public static final String TEXT_LANGUAGE = GenericTestBeanCustomizer.TEXT_LANGUAGE; + /** An optional validator, that is a Function **/ + public static final String VALIDATOR = GenericTestBeanCustomizer.VALIDATOR; + /** The BeanInfo for our class as obtained by the introspector. */ private final BeanInfo rootBeanInfo; diff --git a/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java b/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java index fa19b19d8c..16b4a848fc 100644 --- a/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java +++ b/src/core/src/main/java/org/apache/jmeter/testbeans/TestBeanHelper.java @@ -25,6 +25,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; +import java.util.function.Function; import org.apache.jmeter.testbeans.gui.GenericTestBeanCustomizer; import org.apache.jmeter.testbeans.gui.TableEditor; @@ -83,6 +84,7 @@ public class TestBeanHelper { Class type = desc.getPropertyType(); Object value = unwrapProperty(desc, jprop, type); + validateObjectValue(desc, jprop, value); if (log.isDebugEnabled()) { log.debug("Setting {}={}", jprop.getName(), value); } @@ -105,6 +107,17 @@ public class TestBeanHelper { } } + private static void validateObjectValue(PropertyDescriptor desc, JMeterProperty jprop, Object value) { + Object validator = desc.getValue(BeanInfoSupport.VALIDATOR); + if (validator instanceof Function) { + @SuppressWarnings("unchecked") + Function validatorFunction = (Function) validator; + if (!validatorFunction.apply(value)) { + log.warn("Invalid value [{}] for property [{}]", value, jprop.getName()); + } + } + } + private static Object unwrapProperty(PropertyDescriptor desc, JMeterProperty jprop, Class type) { Object value; if(jprop instanceof TestElementProperty) diff --git a/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java b/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java index 25ee55cfb5..e3aca1ad6e 100644 --- a/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java +++ b/src/core/src/main/java/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java @@ -96,7 +96,7 @@ import org.slf4j.LoggerFactory; * */ public class GenericTestBeanCustomizer extends JPanel implements SharedCustomizer { - private static final long serialVersionUID = 241L; + private static final long serialVersionUID = 242L; private static final Logger log = LoggerFactory.getLogger(GenericTestBeanCustomizer.class); @@ -160,6 +160,8 @@ public class GenericTestBeanCustomizer extends JPanel implements SharedCustomize public static final String DEFAULT_GROUP = ""; + public static final String VALIDATOR = "validator"; + @SuppressWarnings("unused") // TODO - use or remove private int scrollerCount = 0; ````
asfimport commented 3 years ago

piotr.mirek (migrated from Bugzilla): I'll give it a try in the weekend. Thanks for the patch!

asfimport commented 3 years ago

piotr.mirek (migrated from Bugzilla): Hi,

I've made the changes and compiled jmeter 5.2.1 There only change now is that warning is raised in logs for negative number, but no 'hard' notification is sent to the user about the problem.

Instead the warning for negative number it would be better to rise error; still problems for two other cases are not seen in the logs.

Here are the logs:

case 1 (empty value): 2020-11-22 15:55:58,072 INFO o.a.j.e.StandardJMeterEngine: Running the test! 2020-11-22 15:55:58,073 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2020-11-22 15:55:58,076 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, local) 2020-11-22 15:55:58,226 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : case1 2020-11-22 15:55:58,226 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group case1. 2020-11-22 15:55:58,226 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2020-11-22 15:55:58,227 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2020-11-22 15:55:58,227 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2020-11-22 15:55:58,227 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started 2020-11-22 15:55:58,231 INFO o.a.j.t.JMeterThread: Thread started: case1 1-1

case 2 (negative number): 2020-11-22 15:57:54,074 INFO o.a.j.e.StandardJMeterEngine: Running the test! 2020-11-22 15:57:54,074 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2020-11-22 15:57:54,075 WARN o.a.j.t.ConstantThroughputTimerBeanInfo: Number must not be less than zero: [-1.0] 2020-11-22 15:57:54,075 WARN o.a.j.t.TestBeanHelper: Invalid value [-1.0] for property [throughput] 2020-11-22 15:57:54,075 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, local) 2020-11-22 15:57:54,227 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : case2 2020-11-22 15:57:54,227 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group case2. 2020-11-22 15:57:54,227 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2020-11-22 15:57:54,227 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2020-11-22 15:57:54,228 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2020-11-22 15:57:54,228 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started 2020-11-22 15:57:54,229 INFO o.a.j.t.JMeterThread: Thread started: case2 1-1 2020-11-22 15:57:54,230 WARN o.a.j.t.ConstantThroughputTimerBeanInfo: Number must not be less than zero: [-1.0] 2020-11-22 15:57:54,231 WARN o.a.j.t.TestBeanHelper: Invalid value [-1.0] for property [throughput] 2020-11-22 15:57:54,231 INFO o.a.j.t.JMeterThread: Thread is done: case2 1-1 2020-11-22 15:57:54,232 INFO o.a.j.t.JMeterThread: Thread finished: case2 1-1 2020-11-22 15:57:54,232 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test 2020-11-22 15:57:54,232 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, local)

case 3 (string value): 2020-11-22 15:58:42,568 INFO o.a.j.e.StandardJMeterEngine: Running the test! 2020-11-22 15:58:42,568 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2020-11-22 15:58:42,571 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, local) 2020-11-22 15:58:42,708 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : case3 2020-11-22 15:58:42,709 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group case3. 2020-11-22 15:58:42,709 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2020-11-22 15:58:42,709 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2020-11-22 15:58:42,709 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2020-11-22 15:58:42,709 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started 2020-11-22 15:58:42,710 INFO o.a.j.t.JMeterThread: Thread started: case3 1-1