Postman Readme Guide
Postman Readme Guide
Documentation
Release Version 1.8.0 - August 2021
Valentin Despa
1 Cheatsheet 1
1.1 Postman Cheatsheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Dynamic variables 9
2.1 Dynamic variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4 Online course 31
4.1 Contributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2 Postman online course . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
i
ii
CHAPTER 1
Cheatsheet
Thank you for downloading this cheat sheet. This guide refers to the Postman App, not the Chrome extension.
Please report any problems with it.
Postman Cheat Sheet is based on the official Postman documentation and own experience.
For a detailed documentation on each feature, check out https://www.getpostman.com/docs.
1.1.1 Variables
All variables can be manually set using the Postman GUI and are scoped.
The code snippets can be used for working with variables in scripts (pre-request, tests).
Learn more about the different variables scopes in this tutorial.
Global variables
1
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
pm.globals.set('myVariable', MY_VALUE);
Getting
pm.globals.get('myVariable');
pm.variables.get('myVariable');
Removing
Remove one variable
pm.globals.unset('myVariable');
pm.globals.clear();
Collection variables
When to use:
• good alternative to global variables or environment variables
• for URLs / authentication credentials if only one environment exists
Setting
pm.collectionVariables.set('myVariable', MY_VALUE);
Getting
pm.collectionVariables.get('myVariable');
Removing
pm.collectionVariables.unset('myVariable');
Environment variables
Environment variables are tied to the selected environment. Good alternative to global variables as they have a
narrower scope.
When to use:
• storing environment specific information
• URLs, authentication credentials
• passing data to other requests
Setting
pm.environment.set('myVariable', MY_VALUE);
Getting
2 Chapter 1. Cheatsheet
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
pm.environment.get('myVariable');
pm.variables.get('myVariable');
Removing
Remove one variable
pm.environment.unset("myVariable");
pm.environment.clear();
Examples:
pm.environment.name
Data variables
Exist only during the execution of an iteration (created by the Collection Runner or Newman).
When to use:
• when multiple data-sets are needed
Setting
Can only be set from a CSV or a JSON file.
Getting
pm.iterationData.get('myVariable);
pm.variables.get('myVariable');
Removing
Can only be removed from within the CSV or JSON file.
Local variables
Local variables are only available withing the request that has set them or when using Newman / Collection runner
during the entire execution.
When to use:
• whenever you would like to override all other variable scopes—for whatever reason. Not sure though then
this is needed.
Setting
pm.variables.set('myVariable', MY_VALUE);
Getting
pm.variables.get('myVariable', MY_VALUE);
Removing
Local variables are automatically removed once the tests have been executed.
Dynamic variables
All dynamic variables can be combined with strings, in order to generate dynamic / unique data.
Example JSON body:
If you want to use dynamic variables in scripts, you can use the replaceIn starting with Postman v7.6.0.
For more details please see the section dedicated to Dynamic variables
Open Postman Console and use console.log in your test or pre-request script.
Example:
1.1.2 Assertions
Note: You need to add any of the assertions inside a pm.test callback.
Example:
Status code
pm.response.to.have.status(200);
pm.expect(pm.response.code).to.be.oneOf([201,202]);
4 Chapter 1. Cheatsheet
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
Response time
pm.expect(pm.response.responseTime).to.be.below(9);
Headers
Header exists:
pm.response.to.have.header('X-Cache');
pm.expect(pm.response.headers.get('X-Cache')).to.eql('HIT');
Cookies
Cookie exists:
pm.expect(pm.cookies.has('sessionId')).to.be.true;
pm.expect(pm.cookies.get('sessionId')).to.eql('ad3se3ss8sg7sg3');
Body
pm.response.to.have.body("OK");
pm.response.to.have.body('{"success"=true}');
pm.expect(pm.response.text()).to.include('Order placed.');
JSON responses
Parse body (need for all assertions):
pm.expect(response.age).to.eql(30);
pm.expect(response.name).to.eql('John');
pm.expect(response.products.0.category).to.eql('Detergent');
XML responses
Convert XML body to JSON:
Skipping tests
You can use pm.test.skip to skip a test. Skipped tests will be displayed in reports.
Simple example
Conditional skip
Failing tests
You can fail a test from the scripts without writing an assertion:
pm
this is the object containing the script that is running, can access variables and has access to a read-only copy of
the request or response.
pm.sendRequest
Allows to send simple HTTP(S) GET requests from tests and pre-request scripts. Example:
const options = {
method: 'POST',
url: 'https://httpbin.org/post',
header: 'X-Foo:foo',
body: {
mode: 'raw',
raw: JSON.stringify(payload)
}
(continues on next page)
6 Chapter 1. Cheatsheet
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
const options = {
'method': 'POST',
'url': 'https://httpbin.org/post',
'body': {
'mode': 'formdata',
'formdata': [
{'key':'foo', 'value':'bar'},
{'key':'bar', 'value':'foo'}
]
}
};
pm.sendRequest(options, (error, response) => {
if (error) throw new Error(error);
console.log(response.json());
});
1.1.5 Workflows
Only work with automated collection runs such as with the Collection Runner or Newman. It will NOT have any
effect when using inside the Postman App.
Additionaly it is important to note that this will only affect the next request being executed. Even if you put this
inside the pre-request script, it will NOT skip the current request.
Set which will be the next request to be executed
postman.setNextRequest(“Request name");
Stop executing requests / stop the collection run
postman.setNextRequest(null);
8 Chapter 1. Cheatsheet
CHAPTER 2
Dynamic variables
If you want to use dynamic variables in scripts, you can use the replaceIn starting with Postman v7.6.0.
pm.variables.replaceIn('{{$randomFirstName}}');
pm.variables.replaceIn('{{$randomFirstName}} {{$randomLastName}}');
The replaceIn method will return a String with the resolved variables.
Before Postman 7.2, only the following dynamic variables were available:
Starting with version 7.2, Postman is using the faker.js library and added more variables. If used multiple times,
they can return different values per request. Note: the autocomplete support in the Request Builder might be
missing.
9
10
Variable name Description Examples Comment
$randomCity City East Ryanfurt, Jenkinsview
1
$randomStreetName Street name Mckenna Pines, Schiller Highway, Van-
dervort Pike
2
$randomStreetAddress Street with number 98165 Tanya Passage, 0695 Monahan
Squares
$randomCountry Country Belgium, Antarctica (the territory South
of 60 deg S)
$randomCountryCode Country code (2-letter) GY, TK, BG
$randomLatitude Latitude -79.9881, 87.8072
$randomLongitude Longitude -41.5763, 10.4960
$randomColor Color lime, azure, maroon, gold, violet
$randomDepartment Departments in a store Garden, Clothing, Grocery, Kids
$randomProductName Product name Intelligent Steel Sausages, Awesome
Rubber Cheese
3
$randomPrice Price 244.00, 301.00
$randomProductAdjective Product adjective Refined, Handcrafted, Handmade, Sleek
$randomProductMaterial Product material Frozen, Cotton, Wooden, Soft
$randomProduct Simple product name Salad, Cheese, Bike, Soap
$randomCompanyName Company name Christiansen LLC, Corwin Inc, Fahey -
Boyer
$randomCompanySuffix Company suffix LLC, Group, Inc, and Sons
$randomCatchPhrase Catch phrase Centralized upward-trending attitude
$randomBs BS one-to-one unleash communities
$randomCatchPhraseAdjective Catch phrase adjective Total, Diverse, Horizontal
$randomCatchPhraseDescriptor Catch phrase descriptor leading edge, dynamic, attitude-oriented
$randomCatchPhraseNoun Catch phrase noun Graphical User Interface, matrix, bench-
mark
$randomBsAdjective BS adjective compelling, vertical, revolutionary
$randomBsBuzz BS buzz strategize, redefine, streamline
$randomBsNoun BS noun systems, bandwidth, paradigms
$randomDatabaseColumn Database column status, title, name, password, createdAt
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
11
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
12
Variable name Description Examples Comment
$randomCityImage Image with a city http://lorempixel.com/640/480/city
$randomFoodImage Image with food http://lorempixel.com/640/480/food
$randomNightlifeImage Image with nightlife http://lorempixel.com/640/480/nightlife
$randomFashionImage Image with fashion http://lorempixel.com/640/480/fashion
$randomPeopleImage Image with people http://lorempixel.com/640/480/people
$randomNatureImage Image with nature http://lorempixel.com/640/480/nature
$randomSportsImage Image with sport http://lorempixel.com/640/480/sports
$randomTransportImage Image with transportation http://lorempixel.com/640/480/transport
$randomImageDataUri Image as data URI data:image/svg+xml;charset=UTF-8,
%3Csvg%20 . . .
8
$randomEmail Email from popular email providers Mable_Crist@hotmail.com,
Ervin47@gmail.com
$randomExampleEmail Example email Ayla.Kozey27@example.net,
Adrian.Hickle@example.com
$randomUserName Username Minerva42, Shania_Nitzsche
$randomProtocol HTTP Protocol http, https
$randomUrl URL http://daphney.biz, https://ansley.com
$randomDomainName Domain name adaline.org, murray.name, abdul.biz
$randomDomainSuffix Top Level Domain (TLD) extension com, net, biz, name, org
$randomDomainWord Word that can be used within a domain guadalupe, willa, jose
name
$randomIP IP v4 147.236.215.88, 139.159.148.94
$randomIPV6 IP v6 64d7:f61e:d265:167f:3971:9ae3:6853:3c48
$randomUserAgent Browser User-agent Mozilla/5.0 (compatible; MSIE 10.0;
Windows NT 5.2; Trident/5.1)
$randomHexColor Color in hex format #010638, #010638
$randomMACAddress MAC address 15:12:78:1e:96:fe, 99:f4:aa:40:49:59
$randomPassword Password v_Ptr4aTaBONsM0,
8xQM6pKgBUndK_J
$randomLoremWord Lorem ipsum word ipsa, dolor, dicta
$randomLoremWords Lorem ipsum words debitis tenetur deserunt
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
13
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
14
Variable name Description Examples Comment
$randomMimeType MIME type application/x-font-bdf, applica-
tion/omdoc+xml
$randomCommonFileType Common filetype image, application, audio
$randomCommonFileExt Common file extension png, mp3, mpeg, gif
$randomFileType File type x-shader, font, audio, message
$randomFileExt File extension xsm, zirz, xar
$randomDirectoryPath Directory path
$randomFilePath File path
$randomSemver Version (using semantic version) 6.3.4, 2.8.0, 1.7.6
3.1.1 I have an environment variable as {{url}}. Can I use it inside a script (like
pm.sendRequest)?
pm.sendRequest({{url}}/mediaitem/)
You are inside a script, so you need to use the pm.* API to get to that variable. The syntax {{url}} works only
inside the request builder, not in scripts.
Example:
3.1.2 How to use pre-request script to pass dynamic data in the request body?
In the pre-request script you can simply create a JavaScript object, set the desired values and save it as a variable
()
For example if you want to send a request body that looks like:
{
"firstName": "First Name",
"lastName": "Last Name",
"email": "test@example.com"
}
15
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
In the request body you can simply use {{user}}. This also works just as well for nested objects:
{
"user": {{user}}
"address": {
"street": "Foo"
"number": "2"
"city": "Bar"
}
}
You can use console.log(pm.request.body) to understand the current data structure of the request body. With the
method pm.request.body.update you can update the request.
Create/replace JSON request body
const body = {
mode: "raw",
raw: JSON.stringify(
{
name: "jane",
age: 33
}
),
options: {
raw: {
language: "json"
}
}
}
pm.request.body.update(body);
const body = {
mode: "raw",
raw: jsonWithoutComments,
options: {
raw: {
language: "json"
}
}
}
pm.request.body.update(body);
You can modify the request headers from the Pre-request script as follows.
Add header
pm.request.headers.add({
key: 'X-Foo',
value: 'Postman'
});
Remove header
Update header
pm.request.headers.upsert(
{
key: "User-Agent",
value: "Not Postman"
}
);
{
"GroupName":"GroupName_{{$guid}}",
"Description": "Example_API_Admin-Group_Description"
}
{
"GroupName":"GroupName_0542bd53-f030-4e3b-b7bc-d496e71d16a0",
"Description": "Example_API_Admin-Group_Description"
}
The disadvantage of this method is that you cannot use these special variables in a pre-request script or test.
Additionally they will be only generated once per request, so using {{$guid}} more than once will generate
the same data in a request.
Option 2 Using existing JavaScript random generators
Below you will find an exemple function that you can use to generate integer number between a specific interval:
67
Below you will find an exemple function that you can use to generate random strings:
function getRandomString() {
return Math.random().toString(36).substring(2);
}
5q04pes32yi
Option 1 You can trigger another request in the collection from the pre-request script using postman.
setNextRequest.
That can be done with:
The difficulty is returning to the request that initiated the call. Additionally you need to make sure you do not
create endless loops.
Option 2 Another possibility is making an HTTP call from the pre-request script to fetch any data you might need.
Below I am fetching a name from a remote API and setting it as a variable for use in the actual request that will
execute right after the pre-request script completed:
Tip You can generate such requests by using the “Code” generator button right below the Save button, once you
have a request that works. There you can Select NodeJS > Request and the syntax generated is very similar to
what Postman expects.
You can import this example in Postman by using this link: https://www.getpostman.com/collections/
5a61c265d4a7bbd8b303
You can use the following template to send a XML request from a script. Notice that price is a Postman variable
that will be replaced.
const options = {
'method': 'POST',
'url': 'httpbin.org/post',
'header': {
'Content-Type': 'application/xml'
},
body: pm.variables.replaceIn(xmlBody) // replace any Postman variables
}
Assuming your response is in JSON format, You can extract data from the response by using
After this you can set the whole response (or just a subset like this):
pm.environment.set('myData', JSON.stringify(jsonData));
You need to use JSON.stringify() before saving objects / arrays to a Postman variable. Otherwise it may not work
(depending on your Postman or Newman version).
In the next request where you want to retrieve the data, just use:
If you have some information saved on a file locally on your computer, you might want to access this information
with Postman.
Unfortunately this is not really possible. There is a way to read a data file in JSON or CSV format, which allows
you to make some variables dynamic. These variables are called data variables and are mostly used for testing
different iterations on a specific request or collection.
Possible options:
• start a local server to serve that file and to get it in Postman with a GET request.
• use Newman as a custom Node.js script and read the file using the filesystem.
3.2 Assertions
Assertions in Postman are based on the capabilities of the Chai Assertion Library. You can read an extensive
documentation on Chai by visiting http://chaijs.com/api/bdd/
{
"companyId": 10101,
"regionId": 36554,
"filters": [
{
"id": 101,
"name": "VENDOR",
"isAllowed": false
},
{
"id": 102,
"name": "COUNTRY",
"isAllowed": true
},
{
"id": 103,
"name": "MANUFACTURER",
(continues on next page)
Assert that the property isAllowed is true for the COUNTRY filter.
// Get the country filter object by using the index calculated above
var countryFilter = jsonData.filters[countryFilterIndex];
{
"id": "5a866bd667ff15546b84ab78",
"limits": {
"59974328d59230f9a3f946fe": {
"lists": {
"openPerBoard": {
"count": 13,
"status": "ok", <-- CHECK ME
"disableAt": 950,
"warnAt": 900
},
"totalPerBoard": {
"count": 20,
"status": "ok", <-- CHECK ME
"disableAt": 950,
"warnAt": 900
}
}
}
}
}
You want to check the value of the status in both objects (openPerBoard, totalPerBoard). The problem is that in
order to reach both objects you need first to reach the lists object, which itself is a property of a randomly named
object (59974328d59230f9a3f946fe).
So we could write the whole path limits.59974328d59230f9a3f946fe.lists.openPerBoard.
status but this will probably work only once.
3.2. Assertions 21
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
For that reason it is first needed to search inside the limits object for the lists object. In order to make the
code more readable, we will create a function for that:
function findObjectContaininsLists(limits) {
// Iterate over the properties (keys) in the object
for (var key in limits) {
// console.log(key, limits[key]);
// If the property is lists, return the lists object
if (limits[key].hasOwnProperty('lists')) {
// console.log(limits[key].lists);
return limits[key].lists;
}
}
}
The function will iterate over the limits array to see if any object contains a lists object.
Next all we need to do is to call the function and the assertions will be trivial:
pm.test("Check status", function () {
// Parse JSON body
var jsonData = pm.response.json();
Lets presume you have a value from a previous response (or other source) that is saved to a variable.
// Getting values from response
var jsonData = pm.response.json();
var username = jsonData.userName;
How do you compare that variable with values from another API response?
In order to access the variable in the script, you need to use a special method, basically the companion of setting
a variable. Curly brackets will not work in this case:
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(pm.globals.get("username"));
});
where:
• jsonData.ACL[0] is the first element of the ACL array
• to.be.oneOf allows an array of possible valid values
Presumed you want to get the _csrf hidden field value for assertions or later use from the response below:
<ul>
<li>
<label for="username">Username:</label>
<input required type="text" id="username" name="username" />
</li>
<li>
<label for="password">Password:</label>
<input required type="password" id="password" name="password" />
</li>
<li>
<input name="submit" type="submit" value="Login" />
</li>
</ul>
</form>
To parse and retrive the value, we will use the cherrio JavaScript library:
Cheerio is designed for non-browser use and implements a subset of the jQuery functionality. Read more about it
at https://github.com/cheeriojs/cheerio
pm.globals.set('name', jsonData.name);
3.2. Assertions 23
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
You will get the error ReferenceError: jsonData is not defined while setting the global vari-
able.
The reason is that jsonData is only defined inside the scope of the anonymous function (the part with
function() {...} inside pm.test). Where you are trying to set the global variables is outside the function,
so jsonData is not defined. jsonData can only live within the scope where it was defined.
So you have multiple ways to deal with this:
1. define jsonData outside the function, for example before your pm.test function (preferred)
pm.globals.set('name', jsonData.name);
2. set the environment or global variable inside the anonymous function (I would personally avoid mixing test
/ assertions with setting variables but it would work).
{
"uid": "12344",
"pid": "8896",
"firstName": "Jane",
"lastName": "Doe",
"companyName": "ACME"
}
You want to assert that a part of the reponse has a specific value. For example you are not interested in the dynamic
value of uid and pid but you want to assert firstName, lastName and companyName.
You can do a partial match of the response by using the to.include expression. Optionally you can check the
existence of the additional properties without checking the value.
This section contains different examples of validating JSON responses using the Ajv schema validator. I do not
recommend using the tv4 (Tiny Validator for JSON Schema v4).
{}
const schema = {
"type": "object"
};
{
"code": "FX002"
}
This is the JSON schema with a property named code of type String:
const schema = {
"type": "object",
"properties": {
"code": { "type": "string" }
}
};
{
"code": "FX002"
}
This is the JSON schema with a property named “code” of type String that is mandatory:
const schema = {
"type": "object",
"properties": {
"code": { "type": "string" }
},
"required": ["code"]
};
{
"code": "2",
"error": {
"message": "Not permitted."
}
}
This is the JSON schema with the an nested object named “error” that has a property named “message” that is a
string.
const schema = {
"type": "object",
"properties": {
"code": { "type": "string" },
"error": {
"type": "object",
"properties": {
"message": { "type": "string" }
},
"required": ["message"]
}
},
"required": ["code", "error"]
};
Postman comes with a few built-in libraries. If you prefer to add additioal JavaScript libraries, please take a look
at the Custom libraries section.
cheerio
Simple library for working with the DOM model. Useful if you are getting back HTML.
responseHTML = cheerio(pm.response.text());
console.log(responseHTML.find('[name="firstName"]').val());
This script will parse a date, will add one day and will reformat the date.
Read more: https://momentjs.com/docs
crypto-js
Library which implements different crypto functions.
Hash string using SHA256
CryptoJS.SHA256("some string").toString()
HMAC-SHA1 encryption
CryptoJS.HmacSHA1("Message", "Key").toString()
AES Encryption
AES Decryption
eval(response.text());
eval(response.text());
Notice: in order to load a library and use it in Postman, the JavaScript code needs to be “compiled” and ready for
distribution. Usually the code will be available as a *.min.js file or within the dist or umd folder.
3.5 Workflows
3.5.1 How to extract value of an authentication token from a login response body
and pass in subsequent request as ‘Bearer Token’?
Extract the value of the token from the response in the Tests tab:
var jsonData = pm.response.json();
var token = jsonData.accessToken;
Set the token as a variable (global, environment, etc) so that it can used in later requests:
pm.globals.set('token', token);
To use the token in the next request, in the headers part the following needs to be added (key:value example
below):
Authorization:Bearer {{token}}
3.5.2 How to read links from response and execute a request for each of them?
{
"links": [
"http://example.com/1",
"http://example.com/2",
"http://example.com/3",
"http://example.com/4",
"http://example.com/5"
]
}
With the following code we will read the response, iterate over the links array and for each link will submit a
request, using pm.sendRequest. For each response we will assert the status code.
links.forEach(function(link) {
pm.test("Status code is 404", function () {
pm.sendRequest(link, function (err, res) {
pm.expect(res).to.have.property('code', 404);
});
});
});
TODO
3.6 Newman
You have a collection and have a requirement to insert a delay of 10 secs after every request.
In order to do that you can use the --delay parameter and specifiy a delay in miliseconds.
3.6. Newman 29
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
If the Newman output in your CI server is not properly displayed, try adding following flags:
--disable-unicode or / and --color off
Example:
3.6.3 How to pass machine name and port number dynamically when running
the tests?
Suppose, the URL to the server under the test may be different every time you get a new environment for testing,
which is common with cloud environments. i.e. the part machine_name:port_number may be different.
There can be multiple way to do it, so below is one possible solution:
You can set global variables using newman from the CLI.
Online course
4.1 Contributions
This document is part of the online course “Postman: The Complete Guide”.
If you are not already a student of this course you are missing on a lot of training on Postman, including:
• Introduction to Postman
• Creating requests and workflows
• Writing tests
• Continuous Integration / Delivery with Jenkins or other CI/CI tools (Gitlab, TeamCity)
• Practical assignments with personal feedback
• Q&A Forum where you can get answers to your Postman problems
• and much more
31
Postman Quick Reference Guide Documentation, Release Version 1.8.0 - August 2021
If you want to register for this course, you can find more details (including a discount here):
https://vdespa.com/courses
Enjoy!