作为我的负载测试的一部分,在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');
目前错误:
ERRO [0024] GoError:获取https://request-promise?_k6=1:拨打tcp: 查询请求 - 承诺在127.0.0.11:53:读取udp 127.0.0.1:55571->127.0.0.11:53:i / o timeout
如果删除导入,则可以。
然后,如果我将其更改为:
import requestPromise from '../node_modules/request-promise/lib/rp.js';
似乎缓解了这个问题,但随后出现了另一个类似的问题(我认为这取决于模块使用的子依赖项):
ERRO [0004] GoError:获取https://bluebird?_k6=1:拨打tcp:lookup 蓝鸟在127.0.0.11:53:没有这样的主持人
我该怎么做才能解决这个问题?理想情况下,我不想通过每个依赖项及其子项将模块位置转换为绝对路径。
非常感谢。
答案 0 :(得分:0)
我担心现在不容易解决这个问题。你遇到了两个问题。两者都源于k6是Node.js的独特JS执行环境。
第一个是大多数情况下Node.js库在没有"browserified"的情况下无法直接导入,因为k6不支持核心Node.js API,但支持ES5和ES6标准库API(通过https://github.com/zloirock/core-js)。浏览后甚至无法使用许多Node.js库(在这种情况下,不支持HTTP使用的Node.js request API。)
第二,正如您所提到的,k6不支持Node.js使用的相同依赖解析算法(https://nodejs.org/docs/latest/api/modules.html#modules_all_together)。因此,导入语句import requestPromise from 'request-promise';
将无法在Node.js的常用位置找到request-promise
。当k6在本地磁盘上找不到依赖关系时,它会尝试通过网络检索它,导致那些“拨打tcp:没有这样的主机”错误。
未来可能会有更多的Node.js兼容性,主要是依赖于解析(https://github.com/loadimpact/k6/issues/475),但是现在使用Node.js库仍然有点棘手,而不是更普遍的。 / p>