如何在docker容器中使用TestCafe?

问题描述 投票:0回答:1

我正在尝试在 docker 容器内运行 TestCafe 测试。

测试在没有容器的情况下在本地使用 runner 或 cli 正常工作。当我尝试在 docker 容器内运行时,出现此错误:

ERROR Cannot find the browser. "/bin/sh" is neither a known browser alias, nor a path to an executable file.

我使用 testcafe/testcafe 图像作为容器中的启动器,并使用 npm 安装其他包。据我从 docs 读到,testcafe 图像带有 chrome。 Dockerfile:

FROM testcafe/testcafe
USER root

WORKDIR /app
COPY package*.json .
RUN npm install --force --legacy-peer-deps --progress=false

CMD npm run testrunner # this is a command that i define in package.json

package.json

{
  ...
  "main": "index.js",
  "scripts": {
    "cafe:prod:h:3": "npx testcafe 'chrome:headless' --concurrency 3 src/tests/masterdata",
    "testrunner": "node runner.js"
  },
  ...
  "dependencies": {
    "@aws-sdk/client-ssm": "^3.535.0",
    "aws-sdk": "^2.1582.0",
    "dotenv": "^16.4.5",
    "downloads-folder": "^3.0.3",
    "testcafe": "^3.5.0",
    "testcafe-browser-tools": "^2.0.26"
  }
}

runner.js

const createTestCafe = require('testcafe');

(async function () {
  const testcafe = await createTestCafe();
  try {
    const runner = testcafe.createRunner();
    const failed = await runner.src(['src/tests/masterdata']).browsers('chrome:headless').concurrency(3).run();

    console.log('Tests failed: ' + failed);
  } finally {
    await testcafe.close();
  }
})();

我没有在代码中的任何地方引用 /bin/sh 。为什么 testcafe 尝试从这条路径使用 docker?如何在容器内运行 runner.js?

docker e2e-testing testcafe
1个回答
0
投票

错误消息和文档表明您使用的基本映像将 testcafe 工具声明为图像的

ENTRYPOINT
,这意味着
CMD
实际上不是命令,而只是 testcafe 的参数。如果
CMD
是一个字符串,那么 Docker 会自动将其包装在
/bin/sh -c '...'
中,这会导致您看到的特定错误。

如果您想以这种方式运行映像,则需要将 testcafe 参数从

package.json
复制到 Dockerfile 中。这将是
CMD
,即使它不是真正的“命令”,并且它必须使用不使用 shell 解释的 JSON 数组语法。不要忘记将测试也复制到图像中。

COPY src/tests/ src/tests/
CMD ["chrome:headless", "--concurrency", "3", "src/tests/masterdata"]

如果您想保留基础镜像捆绑的工具但运行您自己的命令,则需要覆盖基础镜像的

ENTRYPOINT
。一种选择是将其设置为空 JSON 数组,此时
CMD
恢复为正常命令。

COPY ./ ./
ENTRYPOINT []
CMD npm run testrunner
© www.soinside.com 2019 - 2024. All rights reserved.