作为负载测试的一部分,在 K6 中,我需要针对 AWS 进行身份验证,这需要生成 JWT token 。这需要各种本地模块; 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: Get 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 timeout
如果我删除导入,它可以工作。
然后,如果我将其更改为:
import requestPromise from '../node_modules/request-promise/lib/rp.js';
似乎缓解了这个问题,但随后出现了另一个类似的问题(我认为这取决于模块使用的子依赖项):
ERRO[0004] GoError: Get https://bluebird?_k6=1: dial tcp: lookup bluebird on 127.0.0.11:53: no such host
我能做些什么来解决这个问题?理想情况下,我不想通过每个依赖项及其子项将模块位置转换为其绝对路径。
非常感谢。
最佳答案
恐怕现在不容易解决。你遇到了两个问题。两者都源于 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';
找不到 request-promise
在 Node.js 的常见位置。当 k6 在本地磁盘上找不到依赖项时,它会尝试通过网络检索它,从而导致出现“dial tcp: no such host”错误。
future 可能会有更多的 Node.js 兼容性,主要围绕依赖解析 (https://github.com/loadimpact/k6/issues/475),但目前使用 Node.js 库而不是更通用的库仍然有些棘手。
关于docker - 本地模块未通过 K6 中的 Docker 挂载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48586177/