首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有Cypress仪表板的Cypress并行化

没有Cypress仪表板的Cypress并行化
EN

Stack Overflow用户
提问于 2020-05-23 22:29:43
回答 10查看 7.3K关注 0票数 14

有没有办法在不访问cypress仪表板的情况下运行并行的cypress executors?

我正在尝试让cypress并行运行我的测试,但似乎你必须有互联网连接才能到达cypress仪表板来记录测试。

有人知道我如何绕过这个问题,让测试并行运行,而不依赖Cypress Dashboard或Circle CI这样的特定CI工具吗?

提前感谢!

EN

回答 10

Stack Overflow用户

发布于 2020-06-23 00:36:15

看看这个免费的解决方案,作为一个简单的例子,我在docker-compose中仅使用https://github.com/agoldis/sorry-cypress控制器服务来使测试并行运行:

代码语言:javascript
复制
version: '3.7'
networks:
  default:
    external:
      name: bridge

services:
  cypress:
    container_name: cypress
    build:
      context: ../
      dockerfile: ./docker/cy.Dockerfile
    links:
      - director
    ports:
      - '5555:5555'
    network_mode: bridge

  cypress2:
    container_name: cypress2
    build:
      context: ../
      dockerfile: ./docker/cy.Dockerfile
    links:
      - director
    ports:
      - '5556:5556'
    network_mode: bridge

  mongo:
    image: mongo:4.0
    network_mode: bridge
    ports:
      - 27017:27017

  director:
    image: agoldis/sorry-cypress-director:latest
    environment:
      MONGODB_URI: "mongodb://mongo:27017"
    network_mode: bridge
    ports:
      - 1234:1234
    depends_on:
      - mongo
票数 7
EN

Stack Overflow用户

发布于 2020-05-24 20:26:48

你可以试试这个cypress-parallel-specs-locally

票数 4
EN

Stack Overflow用户

发布于 2021-10-20 16:40:25

所有这些答案似乎都很好,但我想要一些非常简单的东西来使用GitLab,而不需要额外的外部服务。我想出了一个关于Cypress的非常简单的包装器:

代码语言:javascript
复制
const path = require('path');
const fs = require('fs');
const childProcess = require('child_process');
const glob = require('glob-promise');

async function getIntegrationDirectory() {
    let integrationFolder = 'cypress/integration';
    let cypressJson = path.join(process.cwd(), 'cypress.json');
    try {
        await fs.promises.access(cypressJson, fs.constants.F_OK);
        let cypressConfig = require(cypressJson);
        integrationFolder = cypressConfig.integrationFolder ?? integrationFolder;
    }
    catch (err) {
        // Ignore if file does not exist
    }
    return integrationFolder;
}

async function main() {
    let nodeIndex = parseInt(process.env.CI_NODE_INDEX ?? 1, 10);
    let totalNodes = parseInt(process.env.CI_NODE_TOTAL ?? 1, 10);
    let integrationFolder = await getIntegrationDirectory();
    let specs = await glob(integrationFolder + '/**/*.js');
    let start = (nodeIndex - 1) * specs.length / totalNodes | 0;
    let end = nodeIndex * specs.length / totalNodes | 0;
    let specsToRun = specs.slice(start, end);
    let prefix = `Parallel Cypress: Worker ${nodeIndex} of ${totalNodes}`;
    if (!specsToRun.length) {
        console.log(`${prefix}, no specs to run, ${specs.length} total`);
        return;
    }
    console.log(`${prefix}, running specs ${start + 1} to ${end} of ${specs.length} total`);
    let args = process.argv.slice(2)
        .concat(['--spec', specsToRun.join(',')]);
    let child = childProcess.spawn('cypress', args, {stdio: 'inherit', shell: true});
    await new Promise((resolve, reject) => {
        child.on('exit', exitCode => {
            if (exitCode) {
                reject(new Error(`Child process exited with code ${exitCode}`));
            }
            resolve();
        });
    });
}

main().catch(err => {
    console.error(err);
    process.exit(1);
});

它需要安装glob-promiseglob

它与GitLab的parallel keyword很好地集成在一起,并且可以与其他CI运行者一起工作,只需最少的修改。

要使用它,只需将parallel: 4添加到GitLab CI作业,然后调用node parallelCypress.js <some options>。然后它将扫描测试并将它们拆分到可用的并行作业,然后使用--spec选项调用cypress,以便每个作业只运行测试的一部分。

不过还有很大的改进空间,特别是因为并不是所有的spec文件都包含相同数量的测试,也不是所有的测试都有类似的运行时。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61973532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档