1

作为负载测试的一部分,在 K6 中,我需要针对 AWS 进行身份验证,这需要生成 JWT 令牌。这需要各种本地模块;aws-sdk、crypto-js 等等。

这些位于标准./node_modules文件夹中。

我读到 Docker 最初并不了解本地目录,因此需要挂载它们。

这是我目前用来实现此目的的命令:

docker-compose run -v $(pwd)/:/perf k6 run /perf/http_post.js

在我的http_post.js文件中,它有:

import requestPromise from 'request-promise';
http.get('https://google.com');

目前错误:

错误 [0024] GoError: 获取https://request-promise?_k6=1 : dial tcp: lookup request-promise on 127.0.0.11:53: read udp 127.0.0.1:55571->127.0.0.11:53: i/ o 超时

如果我删除导入,它可以工作。

然后,如果我将其更改为:

import requestPromise from '../node_modules/request-promise/lib/rp.js';

似乎缓解了这个问题,但随后出现了另一个类似的问题(我认为这取决于模块使用的子依赖项):

错误 [0004] GoError:获取https://bluebird?_k6=1:拨号 tcp:在 127.0.0.11:53 上查找蓝鸟:没有这样的主机

我能做些什么来解决这个问题?理想情况下,我不想通过每个依赖项及其子项将模块位置转换为其绝对路径。

非常感谢。

4

1 回答 1

0

恐怕现在不容易解决。你遇到了两个问题。两者都源于 k6 是与 Node.js 不同的 JS 执行环境。

首先是 Node.js 库在大多数情况下不能在没有先“浏览”的情况下直接导入,因为 k6 不支持核心 Node.js API,但支持 ES5 和 ES6 标准库 API(通过https ://github.com/zloirock/core-js)。许多 Node.js 库在浏览器化后甚至无法使用(在这种情况下,请求使用的 Node.js HTTP API不受支持)。

第二个是,正如您所提到的,k6 不支持 Node.js 使用的相同依赖解析算法(https://nodejs.org/docs/latest/api/modules.html#modules_all_together)。所以 import 语句import requestPromise from 'request-promise';不会request-promise在 Node.js 常见的地方找到。当 k6 在本地磁盘上找不到依赖项时,它会尝试通过网络检索它,从而导致出现“dial tcp: no such host”错误。

未来可能会有更多的 Node.js 兼容性,主要围绕依赖解析(https://github.com/loadimpact/k6/issues/475),但目前使用 Node.js 库仍然有些棘手超越更一般的。

于 2018-02-26T13:30:05.690 回答