I am new to jmeter,and in my company we are doing webservices testing using jmeter.My requirement is i am using csv data config file for web services testing and here i want to update each row of csv file with test results and i am using beanshell postprocessor,please help
Ex:
csv contains:
Test Case,Dates,Numbers,Results
Total test cases are 16 and i want to update as below for each test case
TC_001,9-03-2016,001,PASS
TC_002,9-03-2016,0002,FAIL
and so one...
Result = "FAIL";
Response = prev.Get....();
If(Response.Contains("Valid"));
Results="PASS";
f = new FileOutputStream("/tmp/oders.csv", true);
p = new PrintStream(f);
this.interpreter.setOut(p);
print(Results + "," + Result);
f.close();
P.Close();
import java.io.File;
import org.apache.jmeter.services.FileServer; //jmeter spelling corrected
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.io.Writer;
File file = new File("csvFilePath");
FileWriter fstream = new FileWriter(file, true);
// true, will append the file if already exist
BufferedWriter out = new BufferedWriter(fstream);
out.write("Save your data which you want to save");
out.write("Save your data which you want to save");
out.close();
fstream.close();
It might not be the best idea as:
You may have problems with re-using this file
You may run into a situation when 2 or more threads will be concurrently writing to the file and it will result in data loss, file corruption or IO Exception
I would recommend adding your "Test Case", "Dates" and "Numbers" variables to JMeter's .jtl results file instead using Sample Variables property like:
Given you have 3 variables: TestCase, Date and Number
Add the following line to user.properties file (it is located under /bin folder of your JMeter installation)
sample_variables=TestCase,Date,Number
On next JMeter restart you will see "TestCase", "Date" and "Number" variable values appended to .jtl results file.
It is also possible to pass the setting as a command-line parameter like:
jmeter -Jsample_variables=TestCase,Date,Number -n -t /path/to/testplan.jmx -l /path/to/results.jtl
References:
Sample Variables
Apache JMeter Properties Customization Guide
I would like to share my experience using BeanShell PostProcessor to write variables to a file.
I captured few responses from the server using "Regular Expression Extractor" and saved it to few variables Var1 & Var2 and when I wrote these variables to a file using "BeanShell PostProcessor", I have observed that it works fine when we run a test with single thread but with multi thread test, the data was being lost.
Say When I inject 100 transactions, I was able to see only 97 records in the output file.
So the best option is to set sample_variables in user.properties file so that you can get the variables out in your .jtl results file.
Related
I used JSR223 Preprocessor to create the request body for a POST JSON request. I used Groovy language for it The code has some parameterization so, I mentioned the path for CSV file in the script as below and attached the Order.csv file to the test plan in load test preview.
CSV file path in the script:
"List lines = new File("Order.csv").readLines()"
So whenever I run the test in Azure load test preview, the is the error message im encountering:
javax.script.ScriptException: java.io.FileNotFoundException: Order.csv (No such file or directory)
How can I fix this. Please Help.
I tried just mentioning the CSV file name in the code and attached the CSV file to the Load test preview along with .jmx file.
This is throwing error saying, File not found
How do you know where guys from Microsoft are placing the CSV file and why do you expect them to copy it to the same place where the .jmx script lives?
I would suggest amending your Groovy script to get the file location dynamically using FileServer class, i.e. change this line:
List lines = new File("Order.csv").readLines()
to something like:
List lines = new File(org.apache.jmeter.services.FileServer.getFileServer().getBaseDir() + File.separator + 'Order.csv').readLines()
More information on Groovy scripting in JMeter: Apache Groovy: What Is Groovy Used For?
Here is what I am trying to do using Jmeter
Firstly,I would like create hundreds of xml payload files with different values and save them in to a folder at some location-How can I achieve that?
Secondly,I would like to use and run the test the generated xml payload files from the folder of above-How can I achieve that?
Much appreciated the thoughts!
Thanks, Raj
For creating XML you can use a suitable JSR223 Test Element, i.e. JSR223 Sampler and generate XML files using Groovy code like:
import groovy.xml.MarkupBuilder
import org.apache.commons.lang3.RandomStringUtils
import org.apache.commons.lang3.RandomUtils
1.upto(2, {
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.records() {
foo(name: RandomStringUtils.randomAlphabetic(5), make: RandomStringUtils.randomAlphabetic(7), year: RandomUtils.nextInt(1000, 9999)) {
country(RandomStringUtils.randomAlphabetic(10))
record(type: RandomStringUtils.randomAlphabetic(15), RandomStringUtils.randomAlphabetic(10))
}
}
new File("test" + "$it" + ".xml") << writer
})
it will create files like test1.xml and test2.xml with random content in "bin" folder of your JMeter installation
The easiest way of using the generated files is Directory Listing Config element, it reads files from the specified folder into a JMeter Variable which will hold the path to the specified file. The file in its turn can be "read" using __FileToString() function
I want to extract Response Title (HTML -> Head->Title) and want to add in CSV using beanshell. Can anyone please help in this. what code need to write in beanshell ?
If you need to store a JMeter Variable into a file the easiest option is using Sample Variables property.
add the next line to user.properties file (located in JMeter's "bin" folder)
sample_variables=yourVar
where yourVar should be your real "Reference Name" from the Regular Expression extractor
restart JMeter to pick up the change
when you run your test next time you will see an extra column in .jtl results file holding the required variable value
The property can be also set via -J command-line argument like:
jmeter -Jsample_variables=yourVar -n -t test.jmx -l result.jtl
If you still want to go for scripting be aware that recommended approach assumes JSR223 Test Elements and Groovy language. You can write a variable into a file in Groovy like:
new File('yourFile.csv') << vars.get('yourVar')
again replace yourVar with your real variable name.
If you still looking for Beanshell, the easiest way would be using FileUtils.writeStringToFile() function like
import org.apache.commons.io.FileUtils;
import java.nio.charset.StandardCharsets;
FileUtils.writeStringToFile(new File("yourFile.csv"), vars.get("yourVar"), StandardCharsets.UTF_8);
I tried to calculate elapsed time as follows. I added the code in Beanshell Post Processor something like this (with courtesy of another thread in StackOverflow).
For the sampler1
long request1 = prev.getTime();
vars.put("sampler1", String.valueOf(request1));
And in sampler 2 I added .
long request2 = prev.getTime();
vars.put("sampler2", String.valueOf(request2));
long request1 = Long.parseLong(vars.get("sampler1"));
long request2 = Long.parseLong(vars.get("sampler2"));
long delta = (request1 - request2); // calculate difference
log.info("Time difference is: " + delta + " ms");
And the same delta is captured in .csv file as follows.
FileOutputStream out = new FileOutputStream("delta.csv", true);
out.write((String.valueOf(delta)).getBytes("UTF-8"));
out.write(System.getProperty("line.separator").getBytes("UTF-8"));
out.flush();
out.close();
I do get the values in the CSV file in a single row.
But I'm looking for a way to capture these values using sample variables and map it to other sample variables that I'm capturing in another CSV file.
I appreciate if someone can provide a way to do this.
Instead of writing variable to another CSV file using Beanshell go for Sampler Variables property instead.
Add the next line to the end of 2nd PostProcessor:
vars.put("delta", String.valueOf(delta));
Add the following line to user.properties file (lives in JMeter's "bin" folder)
sample_variables=delta
On next JMeter restart you will see a new column having "delta" variable value in .jtl results file.
Another approach of setting Sample Variables property is passing it via -J command line argument as:
jmeter -Jsample_variables=delta,somethingelse -n -t testplan.jmx -l results.jtl
See Apache JMeter Properties Customization Guide for more information using, setting and overriding this and other JMeter properties.
You can also use Flexible File Writer for that (you will still need Sample Variables).
i have a little problem with my jmeter test plan.
i have a jdbc request to extract customers in sql databases
from this sql query i retrieve first name and last name only
after that i have a beanshell little script to write all my customers in a csv file :
f = new FileOutputStream(vars.get("InputFilePath"));
p = new PrintStream(f);
nb_customer=Integer.parseInt(vars.get("NOM_#"));
for (i=1;i<=nb_customer;i++) {
p.println(vars.get("NOM_"+i) + ";" + vars.get("PRENOM_"+i));
}
p.close();
f.close();
my problem is that it is an application for our subsidiary company in polska
so, all customers first and last name are in polish language with different symbol, characters.
in the csv file, they appears with a ? in spite of the real character.
can you help me please ?
thanks a lot
Ludo
Try explicitly setting encoding to UTF-8, initialize PrintStream as:
p = new PrintStream(f, true, "UTF-8");
Check out JMeter default encoding as:
log.info(System.getProperty("file.encoding"));
If output is different from UTF-8 add the next line to system.properties file (lives under /bin folder of your JMeter installation:
file.encoding=UTF-8
and restart JMeter. Alternatively you can pass it via -D command line argument like:
jmeter -Dfile.encoding=UTF-8
See Apache JMeter Properties Customization Guide for more information on Jmeter properties and ways of setting and overriding them.
Check file contents in JMeter itself by using FileUtils.readFileToString() method like: