运行 k6
按照以下步骤学习如何
- 运行测试。
- 添加虚拟用户。
- 增加测试时长。
- 在测试运行时递增和递减请求数量。
通过这些示例片段,您将使用您的机器资源运行测试。但是,如果您有 k6 Cloud 账户,您也可以使用 k6 cloud run
命令将测试外包给 k6 服务器运行。
开始之前
运行本地测试
运行一个简单的本地脚本
通过运行以下命令创建并初始化一个新脚本
k6 new
docker run --rm -u $(id -u) -v $PWD:/app -w /app grafana/k6 new
docker run --rm -i -v ${PWD}:/app -w /app grafana/k6 init
此命令将在当前目录中创建一个名为
script.js
的新脚本文件。您也可以指定不同的文件名作为k6 new
命令的参数,例如k6 new my-test.js
。使用以下命令运行 k6
k6 run script.js
# 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
cat script.js | docker run --rm -i grafana/k6 run -
添加虚拟用户
现在运行一个包含多个虚拟用户且持续时间更长的负载测试
k6 run --vus 10 --duration 30s script.js
docker run --rm -i grafana/k6 run --vus 10 --duration 30s - <script.js
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 逻辑。
// init
export default function () {
// vu code: do things here...
}
Init 代码首先运行,并且每个虚拟用户只调用一次。默认代码运行的次数或时长取决于测试选项中的配置。
要了解 k6 的执行方式,请阅读关于测试生命周期的内容。
设置选项
您无需每次运行脚本时都键入 --vus 10
和 --duration 30s
,而是可以在 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 将使用脚本中定义的选项
k6 run script.js
docker run --rm -i grafana/k6 run - <script.js
cat script.js | docker run --rm -i grafana/k6 run -
分阶段递增和递减虚拟用户
您可以在测试期间递增和递减虚拟用户的数量。要配置递增,请使用 options.stages
属性。
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 服务器上执行。
k6 run script.js
分布式模式:测试在 Kubernetes 集群中分布式执行。
将以下 YAML 保存为
k6-testrun-resource.yaml
--- apiVersion: k6.io/v1alpha1 kind: TestRun metadata: name: k6-sample spec: parallelism: 4 script: configMap: name: 'k6-test' file: 'script.js'
使用以下命令应用资源
kubectl apply -f /path/to/k6-testrun-resource.yaml
云模式:测试在 Grafana Cloud k6 上运行。
k6 cloud run script.js