${__P(thread,1) doesn't work in my JMX file - jmeter

${__P(thread,1)---- using this function in "number of threads" at JMX file, the following java code run incorrectly. While using correct numbers it worked. But I want this place can be changeable.
I'm developing a performance testing platform using Jmeter API.
StandardJMeterEngine standardJMeterEngine=new StandardJMeterEngine();
System.setProperty(JMeter.JMETER_NON_GUI, "true");
JMeterUtils.loadJMeterProperties("D:\software\java\apache-jmeter-5.1\bin\jmeter.properties");
JMeterUtils.loadJMeterProperties("D:\software\java\apache-jmeter-5.1\bin\system.properties");
JMeterUtils.loadJMeterProperties("D:\software\java\apache-jmeter-5.1\bin\user.properties");
JMeterUtils.loadJMeterProperties("D:\software\java\apache-jmeter-5.1\bin\saveservice.properties");
JMeterUtils.setJMeterHome("D:\software\java\apache-jmeter-5.1");
JMeterUtils.initLocale();
JMeterUtils.initLogging();
SaveService.loadProperties();
Properties jmeterProps = JMeterUtils.getJMeterProperties();
jmeterProps.put("thread","10");//
File file=new File("F:\a.jmx");
FileServer.getFileServer().setBase(file);
FileServer.getFileServer().setScriptName(file.getName());
Field baseField = FileServer.getFileServer().getClass().getDeclaredField("base");
baseField.setAccessible(true);//
baseField.set(FileServer.getFileServer(), file.getAbsoluteFile().getParentFile());
HashTree scripts=SaveService.loadTree(file);
Summariser summariser = new Summariser(JMeterUtils.getPropDefault("summariser.name", "summary"));
ResultCollector logger = new ResultCollector(summariser);
logger.setFilename("F:\a.jtl");
scripts.add(scripts.getArray()[0],logger);
JMeter.convertSubTree(scripts);
standardJMeterEngine.configure(scripts);
standardJMeterEngine.runTest();

You need to close your {
${__P(thread,1)}
And 1 is the default so you can use
${__P(thread)}
The default value for the property. If omitted, the default is set to "1".

Make sure to explicitly add ApacheJMeter_functions.jar to your project CLASSPATH otherwise neither __P() nor other JMeter Functions will work properly.
Also make sure to escape backslashes like change:
logger.setFilename("F:\a.jtl");
to
logger.setFilename("F:\\a.jtl");
or use forward slashes instead:
logger.setFilename("F:/a.jtl");
More information: Five Ways To Launch a JMeter Test without Using the JMeter GUI

Related

JMeter script to read values from JMeter properties file

Can you please help in reading values from below files using JMeter Script or Beanshell script.
jmeter.properties
user.properties
jmeter.bat
What do you mean by "reading"? JMeter loads the properties defined in jmeter.properties and user.properties during its startup and you can get any value using __P() function
If you need to do this programmatically - here is example Groovy code (can be used in any of JSR223 Test Elements)
def jmeter_properties = new Properties()
jmeter_properties.load(new FileInputStream(new File('jmeter.properties')))
jmeter_properties.each { property ->
log.info(property.getValue())
}
jmeter.bat is a wrapper Windows batch file, it doesn't contain any JMeter Properties definitions

JMeter WebDriver Subsample labels not appearing in results

When using the WebDriver plugin for JMeter and using subsamples the labels that are set during the test do not appear in the results jtl file (and therefore the results tree/aggregate report etc.
WebDriver code (name = TestSampler):
WDS.sampleResult.subSampleStart('First SubSample')
...
WDS.sampleResult.subSampleEnd(true)
WDS.sampleResult.subSampleStart('Second SubSample')
...
WDS.sampleResult.subSampleEnd(true)
Desired outcome:
result.jtl file:
...
1603546255925,1000,First SubSample,,,ThreadGroup 1-1,text,true,,0,0,1,1,null,0,0,0
1603546257658,1000,Second SubSample,,,ThreadGroup 1-1,text,true,,0,0,1,1,null,0,0,0
Actual outcome:
result.jtl file:
...
1603546255925,1000,TestSampler-0,,,ThreadGroup 1-1,text,true,,0,0,1,1,null,0,0,0
1603546257658,1000,TestSampler-1,,,ThreadGroup 1-1,text,true,,0,0,1,1,null,0,0,0
note that the only difference is that the value passed to the ...subSampleStart(label) function appears in the result file instead of an indexed version of the sampler name.
Add the next line to user.properties file:
subresults.disable_renaming=true
Restart JMeter to pick the property up
Next time you will run your test you will see expected names
For GUI mode you can tick Functional Test Mode box on Test Plan level:
More information:
JMeter Bug 62550 - Modify SubResult Naming Policy
Apache JMeter Properties Customization Guide
Configuring JMeter

Unable to pass arguments to a .jmx files from build.gradle file through jmRun

i am facing multiple problems with my .jmx file.
I am working with bzm-concurrency thread group
1) it is not recognising the standard format of passing the user defined values
like: ${__P(SERVER_NAME,localhost)} instead of passing "localhost" to my script it is appending "${__P(SERVER_NAME,localhost)}" to my url.
After passing only the value i.e (localhost) it is working fine
2) Also, iam running my jmeter script from build.gradle file and iam unable to pass the url and other details from them
|SERVER_NAME|${__P(SERVER_NAME,localhost)}| --> this code is not working
|SERVER_NAME|localhost| --> this code is working fine
jmeter {
jmTestFiles = [file("src/main/Jmetrscript.jmx")]
jmSystemPropertiesFiles= [file(path of my properties file)] //to add additional system properties
jmUserProperties = ["SERVER_NAME ="+System.getProperty('SERVER_NAME','localhost'), "SERVER_PORT ="+System.getProperty('SERVER_PORT','9080') ]
enableExtendedReports = true //produce Graphical and CSV reports
}
when i run this using gradlew jmRun -DSERVER_NAME=localhost it is not passing the value.
As per JMeter Gradle Plugin - Advanced Usage
Supported JMeter commandline arguments (see full list here):
-p, --propfile {argument}, the jmeter property file to use
-q, --addprop {argument}, additional property file(s)
-t, --testfile {argument}, the jmeter test(.jmx) file to run
-J, --jmeterproperty {argument}={value}, Define additional JMeter properties
-D, --systemproperty {argument}={value}, Define additional System properties
-S, --systemPropertyFile {filename}, a property file to be added as System properties
-r, --runremote (non-GUI only), Start remote servers (as defined by the jmeter property remote_hosts)
-G, --globalproperty (argument)[=(value)], Define Global properties (sent to servers), e.g. -Gport=123, or -Gglobal.properties
So you should pass JMeter Properties via -J command-line argument like:
jmRun -JSERVER_NAME=localhost etc
References:
Overriding Properties Via The Command Line
Apache JMeter Properties Customization Guide

Jmeter: How to set jmeter.services.FileServe default value?

While executing the test through JMeter I found in Jmeter log:
2017/12/21 02:37:06 INFO - jmeter.services.FileServer: Default base='/u02/project/gold'
2017/12/21 02:37:06 INFO - jmeter.services.FileServer: Set new base='/home/project/gold/JMX'
I am executing the test from /u02/project/gold/apache-jmeter-3.1 but do not know from where JMeter set new base value which is another directory '/home/project/gold/JMX'? Please let me know how I can restrict jmeter to set new base value?
As per Apache JMeter version 3.3 FileServer class source code:
private static final String DEFAULT_BASE = System.getProperty("user.dir");// $NON-NLS-1$
So it should take user.dir (User working directory) Java System Property value as a default
If you need to override this to have another value you can set it by adding the next line to system.properties file (lives in "bin" folder of your JMeter installation)
user.dir=/some/custom/path
JMeter restart will be required to pick the property up.
Another option is setting the property value via -D command-line argument like:
jmeter -Duser.dir=/some/custom/path -n -t test.jmx -l result.jtl
More information:
Configuring JMeter
Apache JMeter Properties Customization Guide
Overriding Properties Via The Command Line

How to get the absolute folder location of a Jmeter .jmx project file from within itself?

I have a Jmeter project that is executed by Maven and is able to locate external Beanshell scripts by the path src/test/jmeter/external-scripts-dir/script1.bsh , but when I run Jmeter directly in the GUI on my computer the relative location doesn't work and the tests cannot be ran standalone. This forces me to run Jmeter from Maven.
So, I have a project file located at a Maven layout location like C:\files\git\projectA\src\test\jmeter\Project.jmx but since I ran jmeter from its installation folder at C:\Jmeter2.12 , it cannot find the relative location of the external script I mentioned earlier.
To solve this, all I need is to set a variable to the directory containing the .jmx file. Is there any possible way to do this?
I can dynamically determine the home of Jmeter ( C:\Jmeter2.12 ) pretty easily (using the following code) but that doesn't help me get the location of the project file.
${__BeanShell(import org.apache.jmeter.services.FileServer; FileServer
.getFileServer().getBaseDir();)}${__BeanShell(File.separator,)}
Is there something similar to the above code that would allow me to deduce the project file location?
If you're looking for the way to locate current script when you run JMeter in GUI mode you can try the following Beanshell expression:
${__BeanShell(import org.apache.jmeter.gui.GuiPackage;GuiPackage.getInstance().getTestPlanFile();)}
If you brake this down into 5 lines there will be:
import org.apache.jmeter.gui.GuiPackage;
import org.apache.commons.io.FilenameUtils;
String testPlanFile = GuiPackage.getInstance().getTestPlanFile();
String testPlanFileDir = FilenameUtils.getFullPathNoEndSeparator(testPlanFile);
vars.put("testPlanFileDir", testPlanFileDir);
log.info("testPlanFileDir:" + testPlanFileDir);
Your current .jmx file fill be stored as scriptFile JMeter Variable.
References:
GuiPackage class JavaDoc
How to use BeanShell: JMeter's favorite built-in component guide
The solution was (thanks to Ardesco) to do the following:
Use the following variables, set in the Test Plan global variables:
projectHome = ${__BeanShell(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir();)}
jmeterHome = ${__BeanShell(System.getProperty("user.dir");)}
scriptHome = ${projectHome}/scripts
Thanks to the accepted answer, I was able to solve a related problem.
Now, I can calculate this parameter once and re-use it as a user variable.
JMETER_SCRIPTS_DIRECTORY=${__BeanShell(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir();)}
Its usage is ${JMETER_SCRIPTS_DIRECTORY}.
Interestingly, it works in both GUI mode and NON GUI mode (from command line).

Resources