【问题标题】:Cypress: how to mark a single test as failed but continue to run other tests?Cypress:如何将单个测试标记为失败但继续运行其他测试?
【发布时间】:2019-11-28 09:27:32
【问题描述】:

目前,当 it() 块中的单个测试失败时,赛普拉斯会完全停止。

我希望赛普拉斯继续运行后续测试,无论之前的测试是否失败(但我仍然想标记失败的测试,以便知道哪个测试失败)。

我试图拦截beforeEach中的失败事件:

beforeEach(() => {
        Cypress.on('fail', (error, runnable) => {
            cy.log('this single test failed, but continue other tests');
            // don't stop!
            // throw error; // marks test as failed but also makes Cypress stop
        });

但我似乎无法在此处理程序中使用任何 cy 命令,因为当我这样做时,由于赛普拉斯奇怪的内部承诺逻辑,它会返回错误:

CypressError:Cypress 检测到您从 命令,同时在该承诺中调用一个或多个 cy 命令。

返回承诺的命令是:

cy.wait()

你在 promise 中调用的 cy 命令是:

cy.log()

因为 Cypress 命令已经类似于 Promise,所以您不需要 包装它们或返回您自己的承诺。

赛普拉斯将使用最终的赛普拉斯解决您的命令 命令产生。

这是错误而不是警告的原因是因为赛普拉斯 在内部将命令串行排队,而 Promises 会尽快执行 当它们被调用时。试图调和这将阻止 赛普拉斯永远无法解决。

https://on.cypress.io/returning-promise-and-commands-in-another-command

如果我将 Cypress.on('fail') 块留空,所有测试都将被标记为通过,即使它们失败了。

如果我取消注释 throw error,赛普拉斯将在任何失败的测试中完全停止。

【问题讨论】:

  • 您使用的是哪个版本?赛普拉斯不会提前失败(AFAIK 也从未失败过),所以你描述的这种行为很奇怪。你能分享一个可重现的回购吗?

标签: javascript cypress


【解决方案1】:

我确保完成后续测试并将失败的测试标记为失败的方法是 - 将每个 it 案例放在不同的文件中,如果需要将它们分组 - 我将它们分组到单独的子文件夹中。

它提高了报告和 cypress 测试运行时间的可读性,因为在此之前我有时会遇到 cypress 在测试之间没有清除其状态的问题,并且我们有内存泄漏。

【讨论】:

    【解决方案2】:

    如果您在测试中throw error,它将以与代码出现问题时相同的方式停止脚本。这按预期运行。您可能需要重新审视您的测试逻辑并考虑添加一些不会将退出代码设置为 1 的存根/间谍。

    缺少此功能(请参阅此问题:https://github.com/cypress-io/cypress/issues/518)。如果你通读它,你会发现一些代码 sn-ps 提到抛出错误以停止测试运​​行器。你这样做是出于相反的意图。

    如果您必须抛出错误并且没有让测试运行程序保释,您需要捕获它。

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2014-01-26
      相关资源
      最近更新 更多