有没有办法在不访问cypress仪表板的情况下运行并行的cypress executors?
我正在尝试让cypress并行运行我的测试,但似乎你必须有互联网连接才能到达cypress仪表板来记录测试。
有人知道我如何绕过这个问题,让测试并行运行,而不依赖Cypress Dashboard或Circle CI这样的特定CI工具吗?
提前感谢!
发布于 2020-06-23 00:36:15
看看这个免费的解决方案,作为一个简单的例子,我在docker-compose中仅使用https://github.com/agoldis/sorry-cypress控制器服务来使测试并行运行:
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发布于 2020-05-24 20:26:48
发布于 2021-10-20 16:40:25
所有这些答案似乎都很好,但我想要一些非常简单的东西来使用GitLab,而不需要额外的外部服务。我想出了一个关于Cypress的非常简单的包装器:
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-promise和glob。
它与GitLab的parallel keyword很好地集成在一起,并且可以与其他CI运行者一起工作,只需最少的修改。
要使用它,只需将parallel: 4添加到GitLab CI作业,然后调用node parallelCypress.js <some options>。然后它将扫描测试并将它们拆分到可用的并行作业,然后使用--spec选项调用cypress,以便每个作业只运行测试的一部分。
不过还有很大的改进空间,特别是因为并不是所有的spec文件都包含相同数量的测试,也不是所有的测试都有类似的运行时。
https://stackoverflow.com/questions/61973532
复制相似问题