【问题标题】:Cypress: interrupt all tests on first failure赛普拉斯:在第一次失败时中断所有测试
【发布时间】:2020-08-22 23:51:01
【问题描述】:

如何在第一次测试失败时中断所有 Cypress 测试?

我们正在使用 semaphore 为每个 PR 使用 Cypress 启动完整的 e2e 测试。但这需要太多时间。

我想在第一次测试失败时中断所有测试。

获取完整的错误是每个开发人员在开发时的工作。如果在部署前出现任何问题,我只想尽快得到通知,而不必等待完整的测试完成。

到目前为止,我想出的唯一解决方案是使用 Cypress 中断对当前规范文件的测试。

afterEach(() => {
        if (this.currentTest.state === 'failed') {
            Cypress.runner.end();
        }
    });

但这还不够,因为它只会中断位于规范文件中的测试,而不是所有其他文件。我今天对这个问题做了一些深入的搜索,似乎这不是赛普拉斯的事情。

所以我正在尝试其他解决方案。

1:带信号量

fail_fast:
  stop:
    when: "true"

它应该在出错时中断脚本。但它不起作用:测试在出错后继续运行。我的猜测是 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"

【问题讨论】:

    标签: semaphore cypress e2e-testing


    【解决方案1】:

    编辑: 似乎引入了此功能,但它需要 Cypress 的付费版本(商业计划)。更多信息:Docs, comment in the thread


    原答案:

    由于某种原因,这一直是赛普拉斯长期要求的功能,但仍未引入。社区提出了一些解决方法,但不能保证它们会起作用。 Check this thread on Cypress' Github for more details, maybe you will find a workaround that works for your case.

    【讨论】:

    • 谢谢。这正是我的想法,我在发布我的问题之前访问了这个链接。解决方法还可以(ish),但我想知道这是否可以通过 Semaphore 或 npm 脚本实现
    • 据我所知,这是不可能的。我遇到的所有解决方法都在此链接中。如果我的回答对您有所帮助,请考虑将其标记为已接受的答案。
    【解决方案2】:

    一个对我有用的小技巧

    Cypress.Commands.add('interrupt', () => {
      eval("window.top.document.body.querySelector('header button.stop').click()");
    });
    

    【讨论】:

    • 虽然它不是一个很好的解决方案,因为就像你说的那样,它有点老套,但效果很好。也许最好发送停止按钮(s 键)的键盘快捷键,这在赛普拉斯的未来版本中不太可能改变。另外,我可能是错的,但我认为您在这里不需要eval()
    【解决方案3】:

    @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()
      })
    }
    

    命令/index.ts

    Cypress.Commands.add('interrupt', () => {
      eval("window.top.document.body.querySelector('header button.stop').click()")
    })
    

    在我的情况下,赛普拉斯测试在 CI(Github 操作工作流程)上无限期等待,但通过此修复,它们会正确中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 2020-05-30
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多