有没有办法在本地机器上运行并行柏树测试,例如 5 个流

Posted

技术标签:

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

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

【问题讨论】:

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

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

    在运行我们的并行运行脚本之前启动 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
    那里有更好更强大的解决方案,但这似乎对我们有用。上面的 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);
      );
  );
;

    上面这部分代码解决了这个问题XDG_CONFIG_HOME=/tmp/cyhome1

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

【讨论】:

【参考方案2】:

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

特点:

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

文章

Cypress parallelization with the Orchestrator — part 1 Cypress parallelization with the Orchestrator — part 2 — ShowCase

展示案例

Orchestrator-Public-Use-Case

【讨论】:

【参考方案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】:

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

    我有一台 MacBook,所以它是为 ios 实现的。 我的应用程序在 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;/*也是有效的。 假设我有 2 个这些 .command 文件。我可以使用以下命令启动它们: open cypress-01.command cypress-02.command 这将启动两个单独的终端,都运行每个文件中提到的规范。

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

【讨论】:

以上是关于有没有办法在本地机器上运行并行柏树测试,例如 5 个流的主要内容,如果未能解决你的问题,请参考以下文章

如何在机器人框架中并行运行多个测试套件上的多个测试用例 | Python

历元 - 并行执行(网格)

有没有办法用 Jest 顺序运行一些测试?

如果本地机器上没有 testcontainer,则 Springboot 测试失败

如何从导航器设置状态或调度操作(例如:柏树测试)

如何在机器人框架中实现并行执行