Run multiple Postman Collection in parallel — Stress-Tests
A known limitation of the Postman Collection Runner is that it can only execute collection in a consecutive way. This is just a simple implementation of the solution explained in this StackOverflow conversation.
Create your Postman Collection and corresponding tests
Here I needed to attack first /api/persons
to get the list of persons ids.
And then /api/persons/:id
for each person in the list.
To do that I used the postman.setNextRequest()
tricks that specify the next request that will be executed in the collection run. And in each run I get the last personId and pop() it from the array in environment variables.
Export your collection and the environment variables
And save the files in a postman/
directory.
Create the new npm project
Simply run npm init -y
and install the 3 dependencies: npm i async newman path
{"name": "newman_parallel","version": "1.0.0","description": "","main": "index.js","scripts": {"start": "node index.js"},"keywords": [],"author": "","license": "ISC","dependencies": {"async": "^3.1.0","newman": "^4.5.6","path": "^0.12.7"}}
The script !
It’s kind of self explanatory, update the path for your postman collection and environment, specify the number of concurrent run you want to launch with the constant PARALLEL_RUN_COUNT
and execute the script with npm start
const path = require('path')const async = require('async')const newman = require('newman')const PARALLEL_RUN_COUNT = 2const parametersForTestRun = {collection: path.join(__dirname, 'postman/postman_collection.json'), // your collectionenvironment: path.join(__dirname, 'postman/localhost.postman_environment.json'), //your envreporters: 'cli'};parallelCollectionRun = function (done) {newman.run(parametersForTestRun, done);};let commands = []for (let index = 0; index < PARALLEL_RUN_COUNT; index++) {commands.push(parallelCollectionRun);}// Runs the Postman sample collection thrice, in parallel.async.parallel(commands,(err, results) => {err && console.error(err);results.forEach(function (result) {var failures = result.run.failures;console.info(failures.length ? JSON.stringify(failures.failures, null, 2) :`${result.collection.name} ran successfully.`);});});
And here you can play around with your api and build some stress tests to see how it handles the pressure. You can find the code in the Github repo.