有没有办法在本地机器上运行并行柏树测试,例如 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
。
每个品牌数组都是并行执行的,但await
ed 会执行每个系列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 <PROJECT_DIRECTORY> && npx cypress run --spec cypress/integration/<SPECS_DIRECTORY>/*" > cypress.command; chmod +x cypress.command
--spec
后面可以堆叠多个目录/文件,因此--spec cypress/integration/<SPECS_DIRECTORY>/* cypress/integration/<SPECS_DIRECTORY2>/*
也是有效的。
假设我有 2 个这些 .command 文件。我可以使用以下命令启动它们:
open cypress-01.command cypress-02.command
这将启动两个单独的终端,都运行每个文件中提到的规范。
这将本地测试的运行时间从 1.5 小时缩短到 15 分钟。
【讨论】:
以上是关于有没有办法在本地机器上运行并行柏树测试,例如 5 个流的主要内容,如果未能解决你的问题,请参考以下文章
如何在机器人框架中并行运行多个测试套件上的多个测试用例 | Python