告別 JMeter!這款 Go 語言神器讓性能測試輕量 10 倍,還支持分佈式壓測

k6 簡介:爲何選擇它

k6 由 Go 語言編寫,相較於傳統工具 JMeter,具有輕量高效、語法簡潔、擴展性強等優勢。其特點包括:

安裝指南

方式 1:直接下載二進制包

  1. 訪問官方下載頁 (https://grafana.com/docs/k6/latest/set-up/install-k6/#download-the-binary)

  2. 根據系統選擇對應版本:

    # macOS
    curl -sSL https://k6.io/install.sh | sudo bash
        
    # Linux
    wget https://github.com/grafana/k6/releases/download/v0.43.0/k6-v0.43.0-linux-amd64.tar.gz
    tar xvfz k6-*.tar.gz
    sudo mv k6-*/k6 /usr/local/bin/
        
    # Windows
    # 下載exe文件後添加至系統PATH

方式 2:通過包管理器安裝

# 使用npm(Node.js包管理器)
npm install -g k6

# Chocolatey(Windows)
choco install k6

驗證安裝

k6 version
# 應輸出類似:k6 v0.43.0 (2023-04-15T08:20:00Z)

使用場景與腳本編寫

場景 1:基礎 HTTP 壓測

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

exportconst options = {
stages: [
    { duration: '30s', target: 10 },  // 30秒內逐步增加到10個虛擬用戶
    { duration: '1m', target: 10 },   // 保持10用戶持續1分鐘
    { duration: '20s', target: 0 },   // 20秒內逐步減少到0用戶
  ],
};

exportdefaultfunction () {
const res = http.get('https://test-api.com/endpoint');
  sleep(1); // 模擬用戶思考時間
}

場景 2:WebSocket 測試

import ws from'k6/ws';

exportdefaultfunction () {
const url = 'wss://echo.websocket.org';
const params = { tags: { my_tag: 'value' } };

const wsConn = ws.connect(url, params, function (socket) {
    socket.on('open'function () {
      socket.send(JSON.stringify({ action: 'test' }));
    });
    
    socket.on('message'function (data) {
      console.log('Received:', data);
      socket.close();
    });
  });

  wsConn.close();
}

場景 3:自定義指標監控

import { Trend } from'k6/metrics';

const errorRate = new Trend('errors');

exportfunction handleSummary(data) {
// 自定義摘要報告
console.log(`\nCustom Report:
    Total Requests: ${data.counters.requests.total}
    Errors: ${errorRate.count}`);
}

exportdefaultfunction () {
const res = http.get('https://api.com');
if (res.status !== 200) {
    errorRate.add(1);
  }
}

高級功能

分佈式測試

# 啓動主節點
k6 run --out json=distributed.json script.js

# 在其他機器啓動從節點
k6 run --out json=distributed.json --tag distributed script.js

集成監控體系

import { Counter, Gauge } from'k6/metrics';

// 自定義指標
const customCounter = new Counter('custom_metric');
const activeUsers = new Gauge('vus');

exportfunction handleSummary(data) {
// 發送指標到InfluxDB
  sendInfluxMetrics(data);
}

exportdefaultfunction (data) {
  activeUsers.add(1);
// ...測試邏輯
  activeUsers.add(-1);
}

// 通過插件實現InfluxDB集成
function sendInfluxMetrics(data) {
const influx = require('k6-influx');
  influx.sendMetrics(data);
}

生成可視化報告

k6 run --out influxdb=http://localhost:8086/write?db=k6 script.js
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6qbn9KLHYpdsC8FpJJn4xw