Skip to content
Back to skills

Configure Load Tests

ASecurity

Check and configure load and performance testing with k6, Artillery, or Locust

  • 58 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added February 8, 2026
testingjavascripttypescriptpythongojavabashdockertestinggitapi

Works with

  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned February 12, 2026

npx -y skills add laurigates/claude-plugins --skill configure-load-tests --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Configure Load Tests?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Configure Load Tests
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/laurigates-configure-load-tests/badge)](https://www.skillsdirectory.com/skills/laurigates-configure-load-tests)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
model: haiku
created: 2025-12-16
modified: 2025-12-16
reviewed: 2025-12-16
description: Check and configure load and performance testing with k6, Artillery, or Locust
allowed-tools: Glob, Grep, Read, Write, Edit, Bash, AskUserQuestion, TodoWrite
argument-hint: "[--check-only] [--fix] [--framework <k6|artillery|locust>]"
name: configure-load-tests
---

# /configure:load-tests

Check and configure load and performance testing infrastructure for stress testing, benchmarking, and capacity planning.

## Context

This command validates load testing setup and optionally configures frameworks for performance testing.

**Load Testing Frameworks:**
- **k6** (recommended) - Modern load testing with JavaScript, excellent DX
- **Artillery** - YAML-based, good for quick tests
- **Locust** - Python-based, distributed testing

**When to Use Each:**
| Framework | Best For |
|-----------|----------|
| k6 | Complex scenarios, CI/CD integration, TypeScript support |
| Artillery | Quick YAML configs, simple API testing |
| Locust | Python teams, distributed testing, custom behavior |

**Load Testing Types:**
- **Smoke Test**: Verify system works under minimal load
- **Load Test**: Expected normal load
- **Stress Test**: Find breaking points
- **Spike Test**: Sudden traffic bursts
- **Soak Test**: Extended duration stability

## Workflow

### Phase 1: Project Detection

Detect existing load testing infrastructure:

| Indicator | Component | Status |
|-----------|-----------|--------|
| `k6` binary or `@grafana/k6` | k6 | Installed |
| `*.k6.js` or `load-tests/` | k6 tests | Present |
| `artillery.yml` | Artillery config | Present |
| `locustfile.py` | Locust tests | Present |
| `.github/workflows/*load*` | CI integration | Configured |

### Phase 2: Current State Analysis

Check for complete load testing setup:

**k6 Setup:**
- [ ] k6 installed (binary or npm)
- [ ] Test scenarios defined
- [ ] Thresholds configured
- [ ] Environment-specific configs
- [ ] CI/CD integration

**Test Coverage:**
- [ ] Smoke tests (minimal load)
- [ ] Load tests (normal load)
- [ ] Stress tests (peak load)
- [ ] Spike tests (burst traffic)
- [ ] Soak tests (endurance)

**Reporting:**
- [ ] Console output configured
- [ ] JSON/HTML reports
- [ ] Grafana Cloud k6 (optional)
- [ ] Trend tracking

### Phase 3: Compliance Report

Generate formatted compliance report:

```
Load Testing Compliance Report
===============================
Project: [name]
Framework: k6

Installation:
  k6 binary               /usr/local/bin/k6          [✅ INSTALLED | ❌ MISSING]
  k6 version              0.50+                      [✅ CURRENT | ⚠️ OUTDATED]
  TypeScript support      @types/k6                  [✅ INSTALLED | ⏭️ OPTIONAL]

Test Scenarios:
  Smoke tests             tests/load/smoke.k6.js     [✅ EXISTS | ❌ MISSING]
  Load tests              tests/load/load.k6.js      [✅ EXISTS | ❌ MISSING]
  Stress tests            tests/load/stress.k6.js    [✅ EXISTS | ⏭️ OPTIONAL]
  Spike tests             tests/load/spike.k6.js     [✅ EXISTS | ⏭️ OPTIONAL]

Configuration:
  Thresholds              response time, error rate  [✅ CONFIGURED | ⚠️ MISSING]
  Environments            staging, production        [✅ CONFIGURED | ⚠️ MISSING]
  Data files              test-data.json             [✅ EXISTS | ⏭️ N/A]

CI/CD Integration:
  GitHub Actions          load-test.yml              [✅ CONFIGURED | ❌ MISSING]
  Scheduled runs          weekly/nightly             [✅ CONFIGURED | ⏭️ OPTIONAL]
  PR gate                 smoke test on PR           [✅ CONFIGURED | ⏭️ OPTIONAL]

Reporting:
  Console output          default                    [✅ ENABLED | ✅ DEFAULT]
  JSON export             results.json               [✅ CONFIGURED | ⚠️ MISSING]
  HTML report             k6-reporter                [✅ CONFIGURED | ⏭️ OPTIONAL]
  Grafana Cloud           k6 cloud                   [✅ CONFIGURED | ⏭️ OPTIONAL]

Overall: [X issues found]

Recommendations:
  - Add response time thresholds
  - Configure CI pipeline for smoke tests
  - Add stress test scenario
```

### Phase 4: Configuration (if --fix or user confirms)

#### k6 Installation

**Install k6:**
```bash
# macOS
brew install k6

# Linux (Debian/Ubuntu)
sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6

# Docker
docker pull grafana/k6

# Or via npm (for CI)
npm install -g @grafana/k6
```

**Install TypeScript support:**
```bash
bun add --dev @types/k6
```

#### Create Directory Structure

```
tests/
└── load/
    ├── config/
    │   ├── base.js           # Shared configuration
    │   ├── staging.js        # Staging environment
    │   └── production.js     # Production environment
    ├── scenarios/
    │   ├── smoke.k6.js       # Minimal load validation
    │   ├── load.k6.js        # Normal load testing
    │   ├── stress.k6.js      # Find breaking points
    │   ├── spike.k6.js       # Burst traffic
    │   └── soak.k6.js        # Endurance testing
    ├── helpers/
    │   ├── auth.js           # Authentication helpers
    │   └── data.js           # Test data generation
    └── data/
        └── users.json        # Test data files
```

#### Create Base Configuration

**Create `tests/load/config/base.js`:**
```javascript
// Base configuration shared across all load tests

export const BASE_URL = __ENV.BASE_URL || 'http://localhost:3000';

// Standard thresholds
export const thresholds = {
  // HTTP errors should be less than 1%
  http_req_failed: ['rate<0.01'],

  // 95% of requests should be below 500ms
  http_req_duration: ['p(95)<500'],

  // 99% of requests should be below 1500ms
  'http_req_duration{expected_response:true}': ['p(99)<1500'],
};

// Default headers
export const headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
};

// Authentication helper
export function getAuthHeaders(token) {
  return {
    ...headers,
    'Authorization': `Bearer ${token}`,
  };
}
```

#### Create Smoke Test

**Create `tests/load/scenarios/smoke.k6.js`:**
```javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
import { BASE_URL, thresholds, headers } from '../config/base.js';

/**
 * Smoke Test
 *
 * Purpose: Verify the system works correctly under minimal load.
 * Run this before other load tests to ensure basic functionality.
 *
 * Usage: k6 run tests/load/scenarios/smoke.k6.js
 */

export const options = {
  // Minimal load: 1 user for 30 seconds
  vus: 1,
  duration: '30s',

  thresholds: {
    ...thresholds,
    // Stricter thresholds for smoke test
    http_req_duration: ['p(95)<200'],
    http_req_failed: ['rate<0.001'], // Basically zero errors
  },

  // Tags for filtering in reports
  tags: {
    test_type: 'smoke',
  },
};

export default function () {
  // Test health endpoint
  const healthRes = http.get(`${BASE_URL}/health`, { headers });

  check(healthRes, {
    'health check status is 200': (r) => r.status === 200,
    'health check response time < 100ms': (r) => r.timings.duration < 100,
  });

  // Test main API endpoint
  const usersRes = http.get(`${BASE_URL}/api/users`, { headers });

  check(usersRes, {
    'users endpoint status is 200': (r) => r.status === 200,
    'users endpoint returns array': (r) => Array.isArray(r.json()),
  });

  sleep(1);
}

// Lifecycle hooks for setup/teardown
export function setup() {
  console.log(`Starting smoke test against ${BASE_URL}`);

  // Verify target is reachable
  const res = http.get(`${BASE_URL}/health`);
  if (res.status !== 200) {
    throw new Error(`Target not reachable: ${res.status}`);
  }

  return { startTime: new Date().toISOString() };
}

export function teardown(data) {
  console.log(`Smoke test completed. Started at: ${data.startTime}`);
}
```

#### Create Load Test

**Create `tests/load/scenarios/load.k6.js`:**
```javascript
import http from 'k6/http';
import { check, sleep, group } from 'k6';
import { Counter, Rate, Trend } from 'k6/metrics';
import { BASE_URL, thresholds, headers, getAuthHeaders } from '../config/base.js';

/**
 * Load Test
 *
 * Purpose: Test system under expected normal load.
 * Simulates typical production traffic patterns.
 *
 * Usage: k6 run tests/load/scenarios/load.k6.js
 * With env: k6 run -e BASE_URL=https://staging.example.com tests/load/scenarios/load.k6.js
 */

// Custom metrics
const apiErrors = new Counter('api_errors');
const successRate = new Rate('success_rate');
const userCreationTime = new Trend('user_creation_time');

export const options = {
  // Ramp up to 50 users over 2 minutes, hold for 5 minutes, ramp down
  stages: [
    { duration: '2m', target: 50 },   // Ramp up
    { duration: '5m', target: 50 },   // Steady state
    { duration: '2m', target: 0 },    // Ramp down
  ],

  thresholds: {
    ...thresholds,
    http_req_duration: ['p(95)<500', 'p(99)<1000'],
    success_rate: ['rate>0.95'],      // 95% success rate
    api_errors: ['count<100'],        // Less than 100 total errors
  },

  tags: {
    test_type: 'load',
  },
};

export default function () {
  // Simulate realistic user journey
  group('Browse Products', () => {
    const listRes = http.get(`${BASE_URL}/api/products`, { headers });

    const listSuccess = check(listRes, {
      'products list status is 200': (r) => r.status === 200,
      'products list has items': (r) => r.json().length > 0,
    });

    successRate.add(listSuccess);
    if (!listSuccess) apiErrors.add(1);

    sleep(1);

    // Get product details
    if (listRes.status === 200 && listRes.json().length > 0) {
      const productId = listRes.json()[0].id;
      const detailRes = http.get(`${BASE_URL}/api/products/${productId}`, { headers });

      check(detailRes, {
        'product detail status is 200': (r) => r.status === 200,
      });
    }

    sleep(2);
  });

  group('User Authentication', () => {
    const loginRes = http.post(
      `${BASE_URL}/api/auth/login`,
      JSON.stringify({
        email: `user${__VU}@example.com`,
        password: 'testpassword123',
      }),
      { headers }
    );

    const loginSuccess = check(loginRes, {
      'login status is 200 or 401': (r) => [200, 401].includes(r.status),
    });

    successRate.add(loginSuccess);

    sleep(1);
  });

  group('API Operations', () => {
    // Create a resource
    const startTime = Date.now();

    const createRes = http.post(
      `${BASE_URL}/api/items`,
      JSON.stringify({
        name: `Test Item ${Date.now()}`,
        description: 'Created by load test',
      }),
      { headers }
    );

    userCreationTime.add(Date.now() - startTime);

    const createSuccess = check(createRes, {
      'create status is 201': (r) => r.status === 201,
    });

    successRate.add(createSuccess);
    if (!createSuccess) apiErrors.add(1);

    sleep(1);
  });

  // Think time between iterations
  sleep(Math.random() * 3 + 1);
}

export function handleSummary(data) {
  return {
    'results/load-test-summary.json': JSON.stringify(data, null, 2),
    stdout: textSummary(data, { indent: '  ', enableColors: true }),
  };
}

// Helper for text summary (built-in)
import { textSummary } from 'https://jslib.k6.io/k6-summary/0.0.2/index.js';
```

#### Create Stress Test

**Create `tests/load/scenarios/stress.k6.js`:**
```javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
import { BASE_URL, headers } from '../config/base.js';

/**
 * Stress Test
 *
 * Purpose: Find the breaking point of the system.
 * Gradually increase load until performance degrades or errors occur.
 *
 * Usage: k6 run tests/load/scenarios/stress.k6.js
 */

export const options = {
  stages: [
    { duration: '2m', target: 50 },    // Below normal load
    { duration: '5m', target: 50 },    // Normal load
    { duration: '2m', target: 100 },   // Around breaking point
    { duration: '5m', target: 100 },   // Hold at breaking point
    { duration: '2m', target: 200 },   // Beyond breaking point
    { duration: '5m', target: 200 },   // Hold beyond breaking point
    { duration: '5m', target: 0 },     // Recovery
  ],

  thresholds: {
    // More lenient thresholds - we expect degradation
    http_req_failed: ['rate<0.10'],     // Up to 10% errors acceptable
    http_req_duration: ['p(95)<2000'],  // 2s at p95 during stress
  },

  tags: {
    test_type: 'stress',
  },
};

export default function () {
  const responses = http.batch([
    ['GET', `${BASE_URL}/api/products`, null, { headers }],
    ['GET', `${BASE_URL}/api/users`, null, { headers }],
    ['GET', `${BASE_URL}/api/orders`, null, { headers }],
  ]);

  responses.forEach((res, i) => {
    check(res, {
      [`batch request ${i} succeeded`]: (r) => r.status === 200,
    });
  });

  sleep(1);
}
```

#### Create Spike Test

**Create `tests/load/scenarios/spike.k6.js`:**
```javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
import { BASE_URL, headers } from '../config/base.js';

/**
 * Spike Test
 *
 * Purpose: Test system behavior under sudden traffic bursts.
 * Simulates viral content, flash sales, or attack scenarios.
 *
 * Usage: k6 run tests/load/scenarios/spike.k6.js
 */

export const options = {
  stages: [
    { duration: '1m', target: 10 },    // Warm up
    { duration: '30s', target: 500 },  // Spike to 500 users
    { duration: '1m', target: 500 },   // Hold spike
    { duration: '30s', target: 10 },   // Scale down
    { duration: '2m', target: 10 },    // Recovery period
    { duration: '30s', target: 500 },  // Second spike
    { duration: '1m', target: 500 },   // Hold second spike
    { duration: '1m', target: 0 },     // Scale down to 0
  ],

  thresholds: {
    http_req_failed: ['rate<0.15'],     // Up to 15% errors during spike
    http_req_duration: ['p(95)<3000'],  // 3s at p95 during spike
  },

  tags: {
    test_type: 'spike',
  },
};

export default function () {
  // Simple request during spike
  const res = http.get(`${BASE_URL}/api/products`, { headers });

  check(res, {
    'status is 200 or 503': (r) => [200, 503].includes(r.status),
    'response time acceptable': (r) => r.timings.duration < 5000,
  });

  // Minimal sleep during spike test
  sleep(0.5);
}
```

#### Create Soak Test

**Create `tests/load/scenarios/soak.k6.js`:**
```javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
import { BASE_URL, headers } from '../config/base.js';

/**
 * Soak Test (Endurance Test)
 *
 * Purpose: Test system stability over extended period.
 * Identifies memory leaks, resource exhaustion, and degradation over time.
 *
 * Usage: k6 run tests/load/scenarios/soak.k6.js
 * Note: This test runs for 2+ hours
 */

export const options = {
  stages: [
    { duration: '5m', target: 100 },    // Ramp up
    { duration: '2h', target: 100 },    // Hold for 2 hours
    { duration: '5m', target: 0 },      // Ramp down
  ],

  thresholds: {
    http_req_failed: ['rate<0.01'],     // Very strict - 1% error rate
    http_req_duration: ['p(95)<500'],   // Consistent performance
    http_req_duration: ['p(99)<1000'],  // No degradation over time
  },

  tags: {
    test_type: 'soak',
  },
};

export default function () {
  // Realistic user journey
  const endpoints = [
    '/api/products',
    '/api/users',
    '/api/orders',
    '/api/categories',
  ];

  const endpoint = endpoints[Math.floor(Math.random() * endpoints.length)];
  const res = http.get(`${BASE_URL}${endpoint}`, { headers });

  check(res, {
    'status is 200': (r) => r.status === 200,
    'consistent response time': (r) => r.timings.duration < 500,
  });

  // Realistic think time
  sleep(Math.random() * 5 + 2);
}
```

### Phase 5: CI/CD Integration

**Create `.github/workflows/load-tests.yml`:**

```yaml
name: Load Tests

on:
  # Manual trigger for full load tests
  workflow_dispatch:
    inputs:
      test_type:
        description: 'Test type to run'
        required: true
        default: 'smoke'
        type: choice
        options:
          - smoke
          - load
          - stress
          - spike
      environment:
        description: 'Target environment'
        required: true
        default: 'staging'
        type: choice
        options:
          - staging
          - production

  # Run smoke tests on PRs
  pull_request:
    paths:
      - 'src/**'
      - 'tests/load/**'

  # Scheduled load tests
  schedule:
    - cron: '0 3 * * 1'  # Weekly on Monday at 3 AM

jobs:
  smoke-test:
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install k6
        run: |
          sudo gpg -k
          sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
          echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
          sudo apt-get update
          sudo apt-get install k6

      - name: Start application
        run: |
          docker compose up -d
          sleep 30  # Wait for services

      - name: Run smoke test
        run: k6 run tests/load/scenarios/smoke.k6.js
        env:
          BASE_URL: http://localhost:3000

      - name: Upload results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: smoke-test-results
          path: results/

  load-test:
    if: github.event_name == 'workflow_dispatch' || github.event_name == 'schedule'
    runs-on: ubuntu-latest
    environment: ${{ github.event.inputs.environment || 'staging' }}
    steps:
      - uses: actions/checkout@v4

      - name: Install k6
        run: |
          sudo gpg -k
          sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
          echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
          sudo apt-get update
          sudo apt-get install k6

      - name: Run load test
        run: |
          TEST_TYPE=${{ github.event.inputs.test_type || 'load' }}
          k6 run tests/load/scenarios/${TEST_TYPE}.k6.js \
            --out json=results/${TEST_TYPE}-results.json
        env:
          BASE_URL: ${{ vars.LOAD_TEST_URL }}

      - name: Upload results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: load-test-results
          path: results/

      - name: Post summary to PR
        if: github.event_name == 'pull_request'
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const results = JSON.parse(fs.readFileSync('results/load-test-summary.json'));

            const summary = `## Load Test Results

            | Metric | Value |
            |--------|-------|
            | Total Requests | ${results.metrics.http_reqs.values.count} |
            | Failed Requests | ${results.metrics.http_req_failed.values.rate.toFixed(4)} |
            | Avg Response Time | ${results.metrics.http_req_duration.values.avg.toFixed(2)}ms |
            | P95 Response Time | ${results.metrics.http_req_duration.values['p(95)'].toFixed(2)}ms |
            | P99 Response Time | ${results.metrics.http_req_duration.values['p(99)'].toFixed(2)}ms |
            `;

            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: summary
            });

  # Optional: Run with k6 Cloud for distributed testing
  k6-cloud:
    if: github.event_name == 'workflow_dispatch' && github.event.inputs.test_type == 'stress'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install k6
        run: |
          sudo gpg -k
          sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
          echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
          sudo apt-get update
          sudo apt-get install k6

      - name: Run on k6 Cloud
        run: k6 cloud tests/load/scenarios/stress.k6.js
        env:
          K6_CLOUD_TOKEN: ${{ secrets.K6_CLOUD_TOKEN }}
          BASE_URL: ${{ vars.LOAD_TEST_URL }}
```

**Add npm scripts to `package.json`:**
```json
{
  "scripts": {
    "test:load:smoke": "k6 run tests/load/scenarios/smoke.k6.js",
    "test:load": "k6 run tests/load/scenarios/load.k6.js",
    "test:load:stress": "k6 run tests/load/scenarios/stress.k6.js",
    "test:load:spike": "k6 run tests/load/scenarios/spike.k6.js",
    "test:load:soak": "k6 run tests/load/scenarios/soak.k6.js",
    "test:load:all": "k6 run tests/load/scenarios/smoke.k6.js && k6 run tests/load/scenarios/load.k6.js"
  }
}
```

### Phase 6: HTML Reporting

**Install k6 HTML reporter:**
```bash
# The reporter is used via import in k6 scripts
# No installation needed, it's loaded from jslib
```

**Add to test scripts:**
```javascript
import { htmlReport } from 'https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js';

export function handleSummary(data) {
  return {
    'results/summary.html': htmlReport(data),
    'results/summary.json': JSON.stringify(data, null, 2),
    stdout: textSummary(data, { indent: '  ', enableColors: true }),
  };
}
```

### Phase 7: Standards Tracking

Update `.project-standards.yaml`:

```yaml
standards_version: "2025.1"
last_configured: "[timestamp]"
components:
  load_tests: "2025.1"
  load_tests_framework: "k6"
  load_tests_scenarios: ["smoke", "load", "stress"]
  load_tests_ci: true
  load_tests_thresholds: true
```

### Phase 8: Updated Compliance Report

```
Load Testing Configuration Complete
====================================

Framework: k6
Version: 0.50+

Configuration Applied:
  ✅ k6 installed
  ✅ TypeScript types configured
  ✅ Test directory structure created
  ✅ Base configuration created

Test Scenarios:
  ✅ smoke.k6.js - Minimal load validation
  ✅ load.k6.js - Normal load testing
  ✅ stress.k6.js - Breaking point detection
  ✅ spike.k6.js - Burst traffic simulation

Scripts Added:
  ✅ bun run test:load:smoke (quick validation)
  ✅ bun run test:load (normal load)
  ✅ bun run test:load:stress (find limits)
  ✅ bun run test:load:spike (burst traffic)

CI/CD:
  ✅ Smoke tests on PRs
  ✅ Scheduled weekly load tests
  ✅ Manual workflow dispatch
  ✅ Results artifact upload

Thresholds:
  ✅ http_req_failed < 1%
  ✅ http_req_duration p(95) < 500ms
  ✅ http_req_duration p(99) < 1000ms

Next Steps:
  1. Run smoke test locally:
     bun run test:load:smoke

  2. Run full load test:
     BASE_URL=https://staging.example.com bun run test:load

  3. View results:
     open results/summary.html

  4. Trigger CI load test:
     Use workflow_dispatch in GitHub Actions

Documentation:
  - k6: https://k6.io/docs
  - Grafana k6 Cloud: https://grafana.com/products/cloud/k6
```

## Flags

| Flag | Description |
|------|-------------|
| `--check-only` | Report status without offering fixes |
| `--fix` | Apply all fixes automatically without prompting |
| `--framework <framework>` | Override framework (k6, artillery, locust) |

## Examples

```bash
# Check compliance and offer fixes
/configure:load-tests

# Check only, no modifications
/configure:load-tests --check-only

# Auto-fix all issues
/configure:load-tests --fix

# Force specific framework
/configure:load-tests --fix --framework artillery
```

## Error Handling

- **k6 not installed**: Provide installation instructions for platform
- **No target URL**: Prompt for BASE_URL configuration
- **Docker not available**: Suggest local app startup
- **CI secrets missing**: Provide setup instructions for k6 Cloud

## See Also

- `/configure:tests` - Unit testing configuration
- `/configure:integration-tests` - Integration testing
- `/configure:api-tests` - API contract testing
- `/configure:all` - Run all compliance checks
- **k6 documentation**: https://k6.io/docs
- **k6 examples**: https://github.com/grafana/k6/tree/master/examples
- **Grafana k6 Cloud**: https://grafana.com/products/cloud/k6

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…