async def process_data():
  return await db.query()
{"model": "gpt-4",
 "temperature": 0.7}
vector_search(query,
  k=5, threshold=0.8)
@app.post("/api/v1")
async def endpoint():
ABOUT SKILLS WORK POSTS CONTACT
BACK TO POSTS
2024-09-29 3 min read

Load Testing with Artillery: A Quick Look

Load testing is essential for verifying that your web applications can handle traffic spikes and maintain performance under stress. On a recent project, we used Artillery for our load testing needs, particularly its integration with Playwright to simulate realistic user interactions.

Load Testing with Artillery

Why Load Testing?

Load testing helps identify the maximum operating capacity of an application and any bottlenecks that might hinder performance. By simulating real-world traffic, we can ensure our application remains responsive under stress.

Getting Started with Artillery

Running Tests Locally

To run Artillery tests on your local machine, follow these steps:

  1. Install Dependencies: Ensure all necessary dependencies are installed.

  2. Execute the Test: Use the following command to run the test:

    artillery run load.yaml --output "reports/test-run-report_$(date +"%Y-%m-%d_%H-%M-%S").json"
    

    Note: Before executing, review the load.yaml configuration to avoid launching too many virtual users. On an M1 MacBook Pro, approximately 40 virtual users is the upper limit.

Scaling with AWS Fargate

For more extensive testing beyond local hardware capabilities, Artillery’s AWS Fargate integration is invaluable. Here’s how to run tests on Fargate:

  1. Run the Test: Use the command below, adjusting the --count parameter as needed:

    artillery run-fargate load.yaml --output "reports/test-run-report_$(date +"%Y-%m-%d_%H-%M-%S").json" --count 10
    

    The --count argument specifies the number of workers. Each worker can handle around 20 virtual users. For instance, to test with 200 concurrent users, set maxVusers: 20 in your YAML and use --count 10.

  2. IAM Configuration: Ensure your AWS account has the necessary IAM Policy (artillery-fargate) and Role (artillery-fargate-role). Update the role’s Trust Policy to allow your user to assume the role.

Understanding Artillery Configuration

Artillery uses a YAML configuration file to define test scenarios. Here’s a breakdown of the key components:

  • Scenarios: Define the user journey you want to simulate. Each scenario can include multiple requests and custom scripts to mimic real-world user interactions.
  • Phases: Control the load pattern, such as ramp-up, steady-state, and ramp-down phases. This helps simulate different traffic conditions.
  • Virtual Users: Specify the number of users and their behavior. You can configure how users are distributed over time and how they interact with your application.

Example Configuration

Here’s a simple example of an Artillery configuration file:

config:
  target: "https://your-application.com"
  phases:
    - duration: 60
      arrivalRate: 5
scenarios:
  - flow:
      - get:
          url: "/"
      - post:
          url: "/login"
          json:
            username: "user"
            password: "pass"

Advanced Testing Scenarios

To simulate complex user interactions, you can chain multiple requests and use custom scripts to handle dynamic data. Artillery supports JavaScript for scripting, allowing you to manipulate data and control flow.

Example of a Complex Scenario

scenarios:
  - flow:
      - get:
          url: "/"
      - post:
          url: "/api/search"
          json:
            query: "Artillery"
      - think: 5
      - get:
          url: "/results"

Integrating with CI/CD

Integrating Artillery into your CI/CD pipeline ensures that performance tests are run automatically with each deployment. This helps catch performance regressions early.

Example with GitHub Actions

name: Load Test

on: [push]

jobs:
  load-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install Artillery
        run: npm install -g artillery
      - name: Run Artillery Test
        run: artillery run load.yaml

Monitoring and Alerts

Set up monitoring to track performance metrics during tests. Use tools like Grafana or AWS CloudWatch to visualize data and set up alerts for anomalies. This ensures you can respond quickly to performance issues.

Analyzing Reports

Artillery offers a robust reporting feature that generates HTML reports with insightful graphs. Additionally, uploading the raw JSON data to platforms like Claude.ai or ChatGPT Advanced Data Analysis can provide further insights.

Our Approach

Currently, our Artillery tests focus on simulating search actions, as these are expected to be the most resource-intensive during traffic surges.

Noel Lynagh

Written by Noel Lynagh

17+ years building AI systems and backends that scale. Available for contract work, consulting, and interesting problems.