菜单
开源

运行 k6

按照以下步骤学习如何

  1. 运行测试。
  2. 添加虚拟用户。
  3. 增加测试时长。
  4. 在测试运行时递增和递减请求数量。

通过这些示例片段,您将使用您的机器资源运行测试。但是,如果您有 k6 Cloud 账户,您也可以使用 k6 cloud run 命令将测试外包给 k6 服务器运行。

开始之前

运行本地测试

运行一个简单的本地脚本

  1. 通过运行以下命令创建并初始化一个新脚本

    linux
    k6 new
    docker
    docker run --rm -u $(id -u) -v $PWD:/app -w /app grafana/k6 new
    windows
    docker run --rm -i -v ${PWD}:/app -w /app grafana/k6 init

    此命令将在当前目录中创建一个名为 script.js 的新脚本文件。您也可以指定不同的文件名作为 k6 new 命令的参数,例如 k6 new my-test.js

  2. 使用以下命令运行 k6

    linux
    k6 run script.js
    docker
    # When using the `k6` docker image, you can't just give the script name since
    # the script file will not be available to the container as it runs. Instead
    # you must tell k6 to read `stdin` by passing the file name as `-`. Then you
    # pipe the actual file into the container with `<` or equivalent. This will
    # cause the file to be redirected into the container and be read by k6.
    
    docker run --rm -i grafana/k6 run - <script.js
    windows
    cat script.js | docker run --rm -i grafana/k6 run -

添加虚拟用户

现在运行一个包含多个虚拟用户且持续时间更长的负载测试

linux
k6 run --vus 10 --duration 30s script.js
docker
docker run --rm -i grafana/k6 run --vus 10 --duration 30s - <script.js
windows
cat script.js | docker run --rm -i grafana/k6 run --vus 10 --duration 30s -

运行一个 30 秒、10 虚拟用户的负载测试

注意

k6 使用虚拟用户 (VU) 并行运行多次迭代。通常来说,虚拟用户越多,模拟的流量越大。

虚拟用户本质上是并行的 while(true) 循环。脚本使用 JavaScript 编写,作为 ES6 模块,因此您可以将较大的测试拆分成较小的部分,或者根据需要创建可复用的部分。

Init 上下文和默认函数

要运行测试,您需要有准备测试的 init 代码,以及发起请求的 VU 代码。

Init 上下文中的代码定义函数并配置测试选项(如 duration)。

每个测试还有一个默认函数,用于定义 VU 逻辑。

JavaScript
// init

export default function () {
  // vu code: do things here...
}

Init 代码首先运行,并且每个虚拟用户只调用一次。默认代码运行的次数或时长取决于测试选项中的配置。

要了解 k6 的执行方式,请阅读关于测试生命周期的内容。

设置选项

您无需每次运行脚本时都键入 --vus 10--duration 30s,而是可以在 JavaScript 文件中设置选项

JavaScript
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
  vus: 10,
  duration: '30s',
};
export default function () {
  http.get('http://test.k6.io');
  sleep(1);
}

如果您运行脚本时不带任何标志,k6 将使用脚本中定义的选项

linux
k6 run script.js
docker
docker run --rm -i grafana/k6 run - <script.js
windows
cat script.js | docker run --rm -i grafana/k6 run -

分阶段递增和递减虚拟用户

您可以在测试期间递增和递减虚拟用户的数量。要配置递增,请使用 options.stages 属性。

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

export const options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m30s', target: 10 },
    { duration: '20s', target: 0 },
  ],
};

export default function () {
  const res = http.get('https://quickpizza.grafana.com/');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

要进行更精细的递增配置,您可以使用场景ramping-vus 执行器。

执行模式

注意

可移植性是 k6 的主要设计目标。

您可以通过最少的更改在不同模式下运行相同的测试。

k6 支持三种执行模式来运行 k6 测试:本地模式、分布式模式和云模式。

  • 本地模式:测试完全在一台机器、容器或 CI 服务器上执行。

    bash
    k6 run script.js
  • 分布式模式:测试在 Kubernetes 集群中分布式执行

    将以下 YAML 保存为 k6-testrun-resource.yaml

    yaml
    ---
    apiVersion: k6.io/v1alpha1
    kind: TestRun
    metadata:
      name: k6-sample
    spec:
      parallelism: 4
      script:
        configMap:
          name: 'k6-test'
          file: 'script.js'

    使用以下命令应用资源

    bash
    kubectl apply -f /path/to/k6-testrun-resource.yaml
  • 云模式:测试在 Grafana Cloud k6 上运行。

    bash
    k6 cloud run script.js

    此外,基于云的解决方案可以在您自己的云基础设施上运行云测试,并接受来自本地分布式测试的结果。