【问题标题】:Is there any way to run parallel cypress tests on local machine, for example 5 streams有没有办法在本地机器上运行并行柏树测试,例如 5 个流
【发布时间】:2019-12-16 19:26:46
【问题描述】:

我正在尝试在本地机器上设置 cypress 并运行并行测试。但我找不到一些信息如何做到这一点。

【问题讨论】:

  • 两天前我向我的软件架构师提出了同样的问题,他说只能在 CI/CD 管道中运行并行 cypress 测试,而不是在本地运行
  • 我在官方网站上找到了相关信息:赛普拉斯从 3.1.0 版本开始可以在多台机器上并行运行记录的测试。虽然并行测试在技术上也可以在单台机器上运行,但我们不建议这样做,因为这台机器需要大量资源才能有效地运行您的测试。 docs.cypress.io/guides/guides/parallelization.html#Overview
  • 是的,他们不推荐它。
  • 但可以这样做:)
  • 是的,但是我没有找到赛瑞斯团队的任何文件。

标签: continuous-integration cypress


【解决方案1】:

A) 最“天真”(1 分钟完成)的解决方案,假设您使用的 linux/macOs 实际上工作得还不错(只是为了在本地重新运行回归),以使用 bash 脚本最后简单&

# to keep vid,pic could cause issue when trying to write and delete at the same time
export CYPRESS_trashAssetsBeforeRuns=false
XDG_CONFIG_HOME=/tmp/cyhome1 cypress run -spec cypress/integration/first.spec.js,cypress/integration/another1.spec.js &
XDG_CONFIG_HOME=/tmp/cyhome2 cypress run -spec cypress/integration/another2.spec.js,cypress/integration/another3.spec.js &

B) 但是,如果您想要更“复杂”的东西,请继续阅读:

但是,在我们的测试中,我们在 4 个数据中心(aws、gc)上运行相同的回归,并且在每个数据中心上运行多个品牌(有些是为了冗余,有些是特定于该 DC 位置),因此对于我们的需求,我们不需要规格平衡。而是平行于柏树进程。

到目前为止,这似乎运作良好,你需要几个先决条件,因为你可以read here。我们不得不解决一些问题。

  1. Xvfb 竞争条件
  2. 具有限制线程数量的能力
  3. 配置文件锁定问题
  4. 图片访问问题

  1. 在运行我们的并行运行脚本之前启动 Xvfb。
    # Start x11 server to avoid race condition in threads
    Xvfb :96 &
    # Make all cypress instances connect to the spawned x11
    export DISPLAY=:96
    # Read 4)
    export CYPRESS_trashAssetsBeforeRuns=false
    # read below (that's where the parallelization happens node.js 10+) 
    node ./main.js
  1. 那里有更好更强大的解决方案,但这似乎对我们有用。上面的 bash 运行下面的 main.js。 每个品牌数组都是并行执行的,但awaited 会执行每个系列forEachSeries,没有它,您只需并行运行所有内容(而不是 2,您将拥有 4 个 threads)。 因此,只要您可以创建一个数组,第一级数组的数量就会定义并行线程的数量。您可以谷歌搜索平衡阵列功能并使用它来平衡阵列,如果您决定平衡规格而不是我们下面所做的“品牌”,您只需修改传递给awaitedSpawn() 的命令类似于XDG_CONFIG_HOME=/tmp/cyhome${cfg.id} cypress run --spec {cfg.spec} .
// main.js
// this part is synchronous
if (run.THREADS_NO >= 2) {
 // 2 threads with 2 brands each
  const threads = {[[brand: "brand1"],[brand: "brand2"],[[brand: "brand3"],[brand: "brand4"]]};
  threads.forEach((threadBrandInfo) => {
    asyncWrapper(threadBrandInfo);
  });
}
// async_stuff.js

// courtesy of https://github.com/toniov/p-iteration
exports.forEachSeries = async (array, callback, thisArg) => {
  for (let i = 0; i < array.length; i++) {
    if (i in array) {
      await callback.call(thisArg || this, await array[i], i, array);
    }
  }
};

const awaitedSpwan = async (cmd) => {
  const child = await exec(cmd);
  return new Promise((resolve, reject) => {
    child.on('close', (code) => {
      if (code === 0) {
        resolve(child.stdout);
      } else {
        const err = new Error(child.stdout,child.stderr);
        reject(err);
      }
    });
  });
}

const asyncWrapper = async (brandsConfigs) => {
  forEachSeries(brandsConfigs, async (cfg) => {
    await awaitedSpawn(`XDG_CONFIG_HOME=/tmp/cyhome${cfg.brand} cypress run`)
      .then((res) => {
        console.log(res);
        return res;
      })
      .catch((e) => {
        console.error(e.stderr);
      });
  });
};
  1. 上面这部分代码解决了这个问题XDG_CONFIG_HOME=/tmp/cyhome1

  2. 只需设置 cypress env var trashAssetsBeforRuns=false 一种方法是使用 cypress.json 或 1) 中的 bash 脚本

【讨论】:

    【解决方案2】:

    我创建了一个名为 orchestrator (https://github.com/0xIslamTaha/orchestrator) 的 npm 工具,以便能够在一台机器上运行您的所有规范。它在底层使用 docker,并将所有规范拆分到多个 docker 机器上。

    特点:

    • 开源。
    • 自动拆分所有规范。
    • 支持多种浏览器。
    • 生成漂亮的 HTML 报告。
    • 易于配置。
    • 与 docker 完美配合。
    • 完整记录。
    • 有一个开源用例存储库(准备就绪)。

    文章

    展示案例

    【讨论】:

      【解决方案3】:

      Bazel+rules_nodejs 能够在同一台机器上并行运行多个 cypress 测试。但是,在 bazel 中编写 cypress 测试的体验将与您习惯的完全不同。

      https://github.com/bazelbuild/rules_nodejs/tree/2.0.0-rc.3/examples/cypress

      【讨论】:

        【解决方案4】:

        从技术上讲,这是可能的。 Cypress 不推荐这样做,因为在同一台机器上运行多个 cypress 实例会消耗大量资源(总体而言是 CPU),并且会降低整个机器的性能并导致无用的结果。

        无论如何,如果您的资源有限并且您无法使用官方仪表板或者您没有多个 CI 服务器可用,您可以在一台机器上运行您的测试,启动 cypress run 多次将您的测试套件划分到多个文件夹中.

        我创建了一个名为 cypress-parallel (https://github.com/tnicola/cypress-parallel) 的 npm 库,它(在第一次运行之后)根据测试运行历史记录平衡和拆分测试套件为多个子集,并为每个子集启动一个赛普拉斯命令。它还从所有规范文件中收集结果,并在执行结束时记录它们。在性能方面,似乎使用 2 个进程可以将整体测试执行时间提高 40%。

        【讨论】:

        • Nicola 干得好,我尝试使用它,但在控制台出现错误 env: node\r: No such file or directory
        • 如果您有任何带有简单工作示例的仓库,请告诉我
        • @EvgeniiBazhanov 你是在 Mac 上运行它吗?我已经尝试解决这个问题,请查看新版本 0.1.4
        • 现在您可以在 v.0.1.5 中传递您自己的规范文件夹:github.com/tnicola/cypress-parallel#scripts-options。如果其他方法不起作用,请直接在 repo 上打开一个问题,否则我们将向该帖子上的所有人发送垃圾邮件。
        • 实际上使用纱线,也许我应该在您的仓库中创建一个包含更多详细信息的问题github.com/tnicola/cypress-parallel/issues 问题是我正在尝试在我们的工作项目中实现您的库,所以我需要创建另一个简单的项目匿名数据
        【解决方案5】:

        嗯,我有点在本地并行运行它们。使用的一些想法:

        1. 我有一台 MacBook,所以它是为 iOS 实现的。
        2. 我的应用程序在 Docker 容器中运行,我只需要一个实例即可同时运行多个测试。通过我的终端,我创建了多个文件,将规范拆分为单独的 .command 文件,如下所示: echo "cd &lt;PROJECT_DIRECTORY&gt; &amp;&amp; npx cypress run --spec cypress/integration/&lt;SPECS_DIRECTORY&gt;/*" &gt; cypress.command; chmod +x cypress.command --spec后面可以堆叠多个目录/文件,因此--spec cypress/integration/&lt;SPECS_DIRECTORY&gt;/* cypress/integration/&lt;SPECS_DIRECTORY2&gt;/*也是有效的。
        3. 假设我有 2 个这些 .command 文件。我可以使用以下命令启动它们: open cypress-01.command cypress-02.command
        4. 这将启动两个单独的终端,都运行每个文件中提到的规范。

        这将本地测试的运行时间从 1.5 小时缩短到 15 分钟。

        【讨论】:

          猜你喜欢
          • 2014-05-16
          • 1970-01-01
          • 2010-10-21
          • 1970-01-01
          • 2017-04-04
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 2021-04-11
          相关资源
          最近更新 更多