Flo*_*dis 4 semaphore e2e-testing cypress
如何在第一次测试失败时中断所有赛普拉斯测试?
我们正在使用 semaphore 为每个 PR 使用 Cypress 启动完整的 e2e 测试。但这需要太多时间。
我想在第一次测试失败时中断所有测试。
获取完整的错误是每个开发人员在开发时的工作。如果在部署之前有任何问题,我只想尽快得到通知,而不必等待完整的测试完成。
到目前为止,我想出的唯一解决方案是使用 Cypress 中断对当前规范文件的测试。
afterEach(() => {
if (this.currentTest.state === 'failed') {
Cypress.runner.end();
}
});
Run Code Online (Sandbox Code Playgroud)
但这还不够,因为它只中断位于规范文件中的测试,而不是所有其他文件。我今天对这个问题做了一些深入的搜索,这似乎不是 Cypress 的事情。
所以我正在尝试其他解决方案。
1:带信号量
fail_fast:
stop:
when: "true"
Run Code Online (Sandbox Code Playgroud)
它应该在出错时中断脚本。但它不起作用:测试在出错后继续运行。我的猜测是 Cypress 只有在所有测试都完成后才会抛出错误。
2:也许随着脚本启动 Cypress,但我没有想法现在这里是我的脚本
"cy:run": "npx cypress run",
"cy:run:dev": "CYPRESS_env=dev npx cypress run",
"cy:test": "start-server-and-test start http-get://localhost:4202 cy:run"
Run Code Online (Sandbox Code Playgroud)
@user3504541 的解决方案非常棒!万分感谢。由于这些问题不断出现,我已经开始放弃使用 Cypress。但无论如何,这是我的配置:
支持/index.ts
declare global {
// eslint-disable-next-line
namespace Cypress {
interface Chainable {
interrupt: () => void
}
}
}
function abortEarly() {
if (this.currentTest.state === 'failed') {
return cy.task('shouldSkip', true)
}
cy.task('shouldSkip').then(value => {
if (value) return cy.interrupt()
})
}
Run Code Online (Sandbox Code Playgroud)
命令/index.ts
Cypress.Commands.add('interrupt', () => {
eval("window.top.document.body.querySelector('header button.stop').click()")
})
Run Code Online (Sandbox Code Playgroud)
就我而言,Cypress 测试在 CI(Github 操作工作流程)上无限期地悬而未决,但通过此修复,它们可以正确中断。
小智 7
一个对我有用的小窍门
Cypress.Commands.add('interrupt', () => {
eval("window.top.document.body.querySelector('header button.stop').click()");
});
Run Code Online (Sandbox Code Playgroud)
编辑:似乎引入了此功能,但它需要 Cypress(商业计划)的付费版本。更多相关信息:文档,在线程中发表评论
原答案:
由于某种原因,这一直是赛普拉斯长期以来要求的功能,但仍未引入。社区提出了一些解决方法,但不能保证它们会起作用。查看 Cypress 的 Github 上的此线程以获取更多详细信息,也许您会找到适合您情况的解决方法。