Introduction

K6 is a powerful self-hosted load testing tool that can be run in Docker and configured to simulate API requests, including authentication, POST requests, and JSON payloads.

This guide provides a step-by-step tutorial on setting up K6 using Docker Compose and gradually moving from a simple request to a more complex Postman-like simulation.

Step 1, Install Docker and Docker Compose

Before running K6 in Docker, ensure that Docker and Docker Compose are installed on your system. If not, install them using:

sudo apt update
sudo apt install docker.io docker-compose -y

Verify the installation:

docker --version
docker-compose --version

Step 2, Create a Simple K6 Test Script

To start with a basic example, create a new file named script.js with the following content:

import http from 'k6/http';
import { sleep, check } from 'k6';

export let options = {
  vus: 5,  // Number of virtual users
  duration: '30s',  // Test duration
};

export default function () {
  let res = http.get('https://test-api.example.com');
  
  check(res, {
    'is status 200': (r) => r.status === 200,
  });
  
  sleep(1); // Simulate wait time
}

This script sends a simple GET request to https://test-api.example.com and validates the response status.

Step 3, Create the Docker Compose File

Create a docker-compose.yml file to configure the K6 test execution:

version: '3.8'
services:
  k6:
    image: grafana/k6
    volumes:
      - ./script.js:/script.js
    command: ["run", "/script.js"]

Step 4, Run the Simple K6 Load Test

To start the K6 test, run:

docker-compose up

This will execute the basic GET request test inside a Docker container.

Step 5, Expanding to a More Complex API Test (Simulating Postman)

Next, create a new test script called script-payload.js that simulates Postman requests with Bearer Token authentication, POST requests, and JSON payloads.

Example: script-payload.js

import http from 'k6/http';
import { sleep, check } from 'k6';

// Environment variables
const BASE_URL = __ENV.BASE_URL || 'https://test-api.example.com';
const BEARER_TOKEN = __ENV.BEARER_TOKEN || 'your-default-token';

export let options = {
  vus: 5,  // Number of virtual users
  duration: '30s',  // Test duration
};

// Define POST request payload
const payload = JSON.stringify({
  name: "John Doe",
  email: "[email protected]",
  message: "Hello from K6!"
});

// Define headers
const headers = {
  'Content-Type': 'application/json',
  'Authorization': `Bearer ${BEARER_TOKEN}`,
};

export default function () {
  let res = http.post(`${BASE_URL}/api/data`, payload, { headers });

  // Validate response
  check(res, {
    'is status 200': (r) => r.status === 200,
    'response contains success': (r) => r.body.includes("success"),
  });

  sleep(1); // Simulate wait time
}

Modify docker-compose.yml to use script-payload.js:

version: '3.8'
services:
  k6:
    image: grafana/k6
    volumes:
      - ./script-payload.js:/script-payload.js
    environment:
      BASE_URL: "https://test-api.example.com"
      BEARER_TOKEN: "your-secure-token-here"
    command: ["run", "/script-payload.js"]

Run the more advanced test with:

docker-compose up

Step 6, Understanding the K6 Test Summary

After running the test, you will see a summary like this:

     data_received........: 15 MB  500 kB/s
     data_sent............: 2 MB   66.7 kB/s
     http_req_duration....: avg=250ms min=100ms med=200ms max=800ms p(90)=600ms p(95)=700ms
     http_req_failed......: 0.00%  ✓ 0  ✗ 1000
     iterations...........: 1000  33.3/s
     checks...............: 1000  100.00% ✓ 1000  ✗ 0

Step 7: Running Different HTTP Methods (GET, PUT, DELETE)

Modify script-payload.js for different request types:

GET Request:

let res = http.get(`${BASE_URL}/api/data`, { headers });

PUT Request:

let res = http.put(`${BASE_URL}/api/data/123`, JSON.stringify({ message: "Updated message" }), { headers });

DELETE Request:

let res = http.del(`${BASE_URL}/api/data/123`, null, { headers });

To save results in JSON format, modify docker-compose.yml:

command: ["run", "/script-payload.js", "--summary-export=summary.json"]

After execution, copy the results from the container:

docker cp $(docker ps -q -f name=k6)://summary.json ./summary.json

Conclusion

With this setup, K6 can fully simulate Postman requests within Docker Compose, starting from a simple GET request and progressing to authenticated API testing with payloads.

This structured approach ensures a smooth learning curve for automated API performance testing.

Leave A Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.