In this tutorial, we will explore how to perform load testing on your Node.js application using Artillery. Load testing is crucial for ensuring that your application can handle a large number of users without crashing or slowing down. Artillery is a powerful and flexible load testing tool that allows you to simulate traffic to your application, generate detailed reports, and analyze performance metrics.
Prerequisites
Before we get started, make sure you have Node.js installed on your machine. You can download and install Node.js from the official website (https://nodejs.org/).
Step 1: Install Artillery
To install Artillery, open a terminal and run the following command:
npm install -g artillery
This command will install Artillery globally on your machine, allowing you to use it from any directory.
Step 2: Create a Node.js Application
For the purpose of this tutorial, we will create a simple Node.js application that we will use for load testing. Create a new directory for your project and navigate into it. Then, create a new file called app.js
and add the following code:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, World!n');
});
server.listen(3000, () => {
console.log('Server running on port 3000');
});
Save the file and run the following command in the terminal to start the server:
node app.js
This will start a simple HTTP server that listens on port 3000 and responds with "Hello, World!" to all requests.
Step 3: Write a Load Testing Scenario
Next, we need to create a load testing scenario that Artillery will use to generate traffic to our Node.js application. Create a new file called scenario.yml
in the same directory as your Node.js application and add the following code:
config:
target: 'http://localhost:3000'
phases:
- duration: 60
arrivalRate: 10
scenarios:
- flow:
- get:
url: '/'
expect:
statusCode: 200
In this scenario, we have specified a target URL (http://localhost:3000) for our Node.js application and defined a single phase with a duration of 60 seconds and an arrival rate of 10 new users per second. The scenario has a single flow that makes a GET request to the root route (‘/’) of the application and expects a response with a status code of 200.
Step 4: Run the Load Test
Now that we have created our load testing scenario, we can use Artillery to run the load test. Open a new terminal window, navigate to the directory where your Node.js application and scenario files are located, and run the following command:
artillery run scenario.yml
Artillery will start simulating traffic to your Node.js application based on the scenario you defined. You will see output in the terminal showing the progress of the test, including the number of requests sent, response times, and error rates.
Step 5: Analyze the Results
Once the load test has completed, Artillery will generate a report with detailed performance metrics that you can use to analyze the behavior of your application under load. The report will be saved in a file named report.json
in the current directory.
To view the report, you can use the artillery report
command:
artillery report --output report.html report.json
This command will generate an HTML report from the JSON output and save it in a file named report.html
. You can open this file in a web browser to view the performance metrics, including response times, throughput, and error rates.
Load testing your Node.js application with Artillery is a crucial step in ensuring that it can handle heavy traffic and deliver optimal performance to users. By following the steps outlined in this tutorial, you can easily set up and run load tests on your application and analyze the results to identify any bottlenecks or performance issues.
Check out my latest course, Build a Shopping App With Next.js + NestJS & Prisma: https://michaelguay.dev/build-a-shopping-app-with-next-js-nestjs-prisma/
Every single time I follow one of your tutorials, I get reminded of why I fell in love with software development(it pays the bills too 😂). Thank you for your detailed explanation of how things work and how to use these technologies to build more reliable systems. ✌🏾
Hello @Michael, I found this channel copying your Udemy course https://www.youtube.com/watch?v=lr8OH-edNmA
I am a big fan and have subscribed to your LMS platform.
Hey @mguay
Can you please make a tutorial of how to implement Scalable crawler with NestJS and microservices? The UI will show the failed/succeeded/loading/queued jobs with re-crawler button on fail 🙏🏻🙌🏻
I learn so much from your channel and your Udemy course ❤. Could you please make a video or course about creating a scalable live stream back-end? I'm familiar with tools like Node Media Server and FFmpeg, but I haven't found a comprehensive solution for building a large and efficient system.
I’ve learned a lot of stuff from your channel. Thanks a million!
interesting. would it be a good idea / is it possible to define a set of endpoints to subsequently call to mimic normal user behavior, and then spawn like 1000 of them?
Wow this video is published in right time for me. I am doing my thesis and I am finding a way to monitor the loads.
I have one question: we usually test this on a test api like the one in the video or we should test with the real API?