菜单
文档breadcrumb arrow Grafana k6breadcrumb arrow 参考breadcrumb arrow 归档命令
开源

归档命令

什么是归档?

当 k6 测试的复杂性超出单个 JS 文件时,查找和捆绑所有依赖项(JS 文件、open() 的数据文件、TLS 客户端证书等)会很快变得麻烦。k6 归档是一种捆绑和分发或共享测试的本地方式。

k6 归档只是一个 tar 文件,其中包含执行 k6 测试所需的所有文件。

如何创建和运行归档

假设您通常使用以下命令执行测试:

bash
k6 run script.js

现在,如果您将 run 替换为 archive,k6 将运行代码的 init 阶段来确定正在导入哪些 JS 文件以及正在 open() 的数据文件,并将所有文件捆绑到一个 tar 文件中

bash
k6 archive script.js

这将在磁盘上生成一个名为 archive.tar 的 tar 文件(您可以通过设置 -O filename.tar 来更改)。运行归档也很容易,因为 k6 run 与归档文件兼容,您可以执行:

⚠️ 覆盖选项

一如既往,您可以在运行归档时使用 CLI 标志或环境变量覆盖选项。

bash
k6 run archive.tar

用例

归档文件有多种用例,但它们都共享将测试文件捆绑到一个文件中以便于分发的需求。

共享测试

通过将测试捆绑到归档中,您可以轻松地将测试与您的队友共享,只需存储或发送一个 tar 文件即可。正如我们在上一节中看到的,您的队友可以通过运行 k6 run archive.tar 来执行归档。

为 CI 准备测试

如果您有一个复杂的 CI pipeline 并且您的负载测试与应用程序代码分离,您可以在负载测试源代码更改时将 k6 归档存储为构建 artifact,然后在需要时从 artifact 存储中拉取这些 k6 归档进行测试执行。

k6 Cloud 执行

k6 提供了一种商业服务,用于在托管的云基础设施上运行大规模和地理分布的负载测试。云执行的测试通过 k6 cloud run script.js 命令(类似于 k6 run)从 k6 命令行触发,这将触发隐式创建 k6 归档,然后上传并分发到 k6 Cloud 负载生成器执行。

上传归档到 k6 Cloud

在某些场景下,例如计划执行,用户可能希望将归档上传到 k6 Cloud 而不触发测试执行。

为了满足这个用例,引入了 k6 cloud upload 命令。该命令允许用户将归档上传到 k6 Cloud 而不触发测试执行。命令语法如下:

bash
k6 cloud upload archive.tar

分布式执行

k6-operator 可以将 k6 测试分布到 Kubernetes 集群中。

当 k6 测试包含多个文件时,您可以使用归档功能将 k6 测试捆绑到一个*归档*文件中,并将此文件传递给运行测试。

归档文件的内容

归档包含原始 JS 代码源代码、所有 open() 的数据文件、SSL/TLS 客户端证书,以及包含所有选项的 metadata.json 文件(CLI环境变量脚本内置选项 (export let options = {...}) 设置的选项的层叠)。

让我们从以下示例测试创建归档。这是文件在文件系统中的布局:

bash
/home/johndoe/tests/api-test $ tree
.
├── utils
|   └-- common.js
├── endpoints
|   ├── login.js
|   └-- search.js
├── node_modules
|   └-- somelib
|       └-- lib.js
├── data
|   └-- users.json
└-- script.js

现在,如果当前工作目录是 /home/johndoe/tests/api-test/,我们运行 k6 archive script.js,我们将得到一个名为 archive.tar 的 tar 文件(您可以使用 -O filename.tar 更改文件名)。归档文件的内容将如下所示:

bash
├-- data
├-- files
|   └-- home
|       └-- nobody <-- the username has been anonymized (see section further down)
|           └-- tests
|               └-- api-test
|                   └-- data
|                       └-- users.json
├-- metadata.json
└-- scripts
    └-- home
        └-- nobody <-- the username has been anonymized (see section further down)
            └-- tests
                └-- api-test
                    ├-- script.js
                    ├-- utils
                    |   └-- common.js
                    ├-- endpoints
                    |   ├-- login.js
                    |   └-- search.js
                    └-- node_modules
                        └-- somelib
                            └-- lib.js

分解文件结构,我们得到:

data 包含主 JS 文件(本例中为 script.js)的源代码。

files 包含所有 open() 数据文件的完整原始目录树。

metadata.json 根据 CLI 标志环境变量脚本内置选项 解析的此测试的“默认”选项。

scripts 包含所有 import 的 JS 依赖项的完整原始目录树。

json
{
  "type": "js",
  "options": {
    "paused": null,
    "vus": null,
    "duration": null,
    "iterations": null,
    "stages": null,
    "setupTimeout": null,
    "teardownTimeout": null,
    "rps": null,
    "maxRedirects": null,
    "userAgent": null,
    "batch": null,
    "batchPerHost": null,
    "httpDebug": null,
    "insecureSkipTLSVerify": null,
    "tlsCipherSuites": null,
    "tlsVersion": {
      "min": "",
      "max": ""
    },
    "tlsAuth": null,
    "throw": null,
    "thresholds": null,
    "blacklistIPs": null,
    "hosts": null,
    "noConnectionReuse": null,
    "ext": null,
    "summaryTrendStats": null,
    "systemTags": [
      "url",
      "name",
      "check",
      "error",
      "tls_version",
      "method",
      "subproto",
      "status",
      "group",
      "proto"
    ],
    "tags": null
  },
  "filename": "/home/johndoe/tests/api-test/script.js",
  "pwd": "/home/johndoe/tests/api-test/",
  "env": {}
}

归档文件不包含的内容

我们尽量谨慎地选择归档文件中的内容。为此,我们采取了一些措施:

  • 我们匿名化 JS 和数据文件依赖项路径中的用户名。
  • 默认情况下,k6 会从归档中省略系统环境变量。但是,如果您使用 --include-system-env-vars 标志,k6 会在归档中包含环境变量(以及通过 --env 传递的任何变量)。为了避免在归档中包含系统环境变量,您可以使用 k6 归档标志 --exclude-env-vars