Cypress:如何将单个测试标记为失败但继续运行其他测试?

van*_*ert 9 javascript cypress

当前,当it()块中的单个测试失败时,Cypress 会完全停止。

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

我试图拦截失败事件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
        });
Run Code Online (Sandbox Code Playgroud)

但看起来我不能cy在这个处理程序中使用任何命令,因为当我这样做时,由于赛普拉斯奇怪的内部承诺逻辑,它会返回一个错误:

CypressError:赛普拉斯检测到您从命令返回了一个承诺,同时还调用了该承诺中的一个或多个 cy 命令。

返回承诺的命令是:

cy.wait()

您在承诺中调用的 cy 命令是:

cy.log()

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

无论最终 Cypress 命令产生什么结果,Cypress 都会解析您的命令。

这是一个错误而不是警告的原因是因为 Cypress 在内部按顺序排列命令,而 Promises 会在调用后立即执行。试图调和这会阻止赛普拉斯解决问题。

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

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

如果我取消注释throw errorCypress 将在任何失败的测试中完全停止。

NAN*_*fan 1

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

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

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