k6怎样性能测试

联启 网络工具 13

本文目录导读:

k6怎样性能测试-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 第一步:安装 k6
  2. 第二步:编写第一个测试脚本
  3. 第三步:运行测试
  4. 第四步:理解核心概念
  5. 第五步:进阶使用场景
  6. 第六步:分析报告
  7. 第七步:最佳实践与常见误区
  8. 总结:k6 适合做什么?

这是一个非常实用的问题,k6 是目前最流行的开源性能测试工具之一,核心优势是用 JavaScript 编写脚本资源占用极低原生支持 HTTP/1.1、HTTP/2、WebSocket、gRPC

下面是一份从安装、编写脚本、运行到分析结果的完整指南。

第一步:安装 k6

k6 是一个单文件二进制工具,安装非常简单:

  • macOS (Homebrew):
    brew install k6
  • Windows (Chocolatey / winget):
    choco install k6
    # 或
    winget install k6
  • Linux (Debian/Ubuntu):
    sudo apt update
    sudo apt install k6
  • Docker:
    docker pull grafana/k6

安装后运行 k6 version 确认安装成功。

第二步:编写第一个测试脚本

k6 脚本用 JavaScript 编写,创建一个文件 test.js

// 1. 引入 k6 内置模块
import http from 'k6/http';
import { sleep, check } from 'k6';
// 2. 可选:配置测试选项(也可以在命令行中指定)
export const options = {
    // 虚拟用户数
    vus: 10,
    // 测试持续时间
    duration: '30s',
    // 断言阈值:失败率不能超过1%
    thresholds: {
        http_req_failed: ['rate<0.01'],
        http_req_duration: ['p(95)<2000'], // 95%的请求响应时间小于2秒
    },
};
// 3. 默认函数 - 每个VU(虚拟用户)循环执行这个函数
export default function () {
    // 发送GET请求
    const response = http.get('https://httpbin.test.k6.io/get');
    // 对响应进行断言检查
    check(response, {
        '状态码是200': (r) => r.status === 200,
        '响应时间 < 1秒': (r) => r.timings.duration < 1000,
    });
    // 思考时间:模拟用户等待
    sleep(1);
}

第三步:运行测试

在终端执行:

k6 run test.js

你会看到实时输出,包括:

  • 正在发起的请求数
  • 当前请求速率
  • 响应时间
  • 测试结束后的总结报告(包括请求量、延迟分布、失败率等)

第四步:理解核心概念

  1. VU——虚拟用户(Virtual Users)

    • 每个 VU 独立执行 default 函数。
    • 通过 -uoptions.vus 设置。
  2. 阶段(Stages)——更真实的负载模式: 相比固定 vus,用 stages 可以模拟逐步增加压力

    export const options = {
        stages: [
            { duration: '2m', target: 100 },  // 2分钟内从0增加到100个VU
            { duration: '5m', target: 100 },  // 保持100个VU 5分钟
            { duration: '2m', target: 0 },    // 2分钟内逐步降到0,平稳结束
        ],
    };
  3. 检查(Checks)

    用于验证请求是否成功(如状态码、响应内容),不会中断测试,只记录结果。

  4. 阈值(Thresholds)

    • 用于定义测试通过/失败的标准'http_req_duration': ['p(95)<2000'] 表示 95% 的请求必须低于 2 秒。

第五步:进阶使用场景

测试 POST API(登录、提交数据)

import http from 'k6/http';
import { check } from 'k6';
export default function () {
    const url = 'https://test-api.com/login';
    const payload = JSON.stringify({
        email: 'user@example.com',
        password: '123456',
    });
    const params = {
        headers: {
            'Content-Type': 'application/json',
        },
    };
    const res = http.post(url, payload, params);
    check(res, { '登录成功': (r) => r.status === 200 });
}

动态数据与参数化

避免多个虚拟用户使用相同数据导致缓存命中或冲突:

import { SharedArray } from 'k6/data'; // 共享数据,节省内存
import { randomItem } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
// 从文件加载数据
const userList = new SharedArray('users', function () {
    return JSON.parse(open('./users.json')).users;
});
export default function () {
    const user = randomItem(userList);
    // 使用 user.username, user.password 发起请求
}

使用浏览器(真实浏览器交互)

k6 也有浏览器测试能力(k6 browser),但这不是它的核心场景,如果必须测试前端SPA(单页应用)的渲染,可以考虑,但纯后端API/接口测试是k6的绝对强项

第六步:分析报告

运行 k6 run 后,终端会输出类似这样的报告:

     data_received...........: 1.2 GB  40 MB/s
     data_sent...............: 80 MB   2.7 MB/s
     http_req_blocked........: avg=1.2ms   min=0s     med=0s     ...
     http_req_connecting.....: avg=1.1ms   min=0s     med=0s     ...
     http_req_duration.......: avg=124ms   min=10ms   med=95ms   max=2.3s
       { expected_response:true }........: avg=124ms  ... ...
     http_req_failed.........: 0.02% ✓ 2          ✗ 9980
     http_req_receiving......: avg=0.3ms   ...
     http_req_sending........: avg=0.2ms   ...
     http_req_tls_handshaking: avg=1.1ms   ...
     http_req_waiting........: avg=122ms   ...
     http_reqs...............: 10000  333.33/s
     iteration_duration......: avg=1.12s   ...
     iterations..............: 10000  333.33/s
     vus.....................: 10     min=10        max=100
     vus_max.................: 100

重点看这几个指标:

  • http_req_duration:平均/中位数/P95/P99 响应时间,这是最重要的指标。
  • http_req_failed:请求失败率。
  • http_reqs:总请求数和每秒请求数(RPS,Requests Per Second)——衡量系统吞吐量。

第七步:最佳实践与常见误区

✅ 正确做法 ❌ 错误做法
1个VU 开始,逐步增加 一上来就跑 1000 VU
使用 stages 模拟爬坡(ramp-up) 固定 VU 数直接冲击
使用 check 验证正确性 只看响应时间,不看是否正确返回
VU 之间数据隔离(参数化) 所有 VU 用同一个用户名/数据
测试时间至少 3-5分钟 以上 只跑几十秒(系统缓存可能还没生效)
监控服务端指标(CPU/内存/DB)配合 只看 k6 客户端报告

k6 适合做什么?

  1. API 接口性能测试(最优场景)
  2. 压力测试(找出系统最大承载能力)
  3. 负载测试(验证系统在预期负载下的表现)
  4. 冒烟测试(低负载快速验证系统是否存活)

不适合: 非常复杂的浏览器端交互性能测试(这种情况推荐 Playwright + 自建指标,或使用专有工具 LoadRunner)。

标签: k6 性能测试

抱歉,评论功能暂时关闭!